1. 18 Jul, 2018 6 commits
    • Doron Roberts-Kedes's avatar
      DeterministicSchedule: Deschedule parent threads while they wait to join child threads. · 49a83b77
      Doron Roberts-Kedes authored
      Summary:
      Eliminate while loop behavior in DeterministicSchedule::join
      
      Depends on D8789304
      
      Reviewed By: djwatson
      
      Differential Revision: D8840276
      
      fbshipit-source-id: f0b0db60f7bec344d021a49cec408a2604d4a1c8
      49a83b77
    • Doron Roberts-Kedes's avatar
      DeterministicSchedule: Deschedule threads waiting to acquire DeterministicMutex · 566f0478
      Doron Roberts-Kedes authored
      Summary: Eliminate spinlock behavior from DeterministicMutex::lock by descheduling threads waiting to acquire the mutex, and placing the thread local semaphore in a waitqueue for the mutex. The unlocking thread reschedules a single waiting thread if the workqueue is non empty.
      
      Reviewed By: djwatson
      
      Differential Revision: D8789304
      
      fbshipit-source-id: 8ffe3e289c9abfe7515b678ff98f0cefef2461c0
      566f0478
    • Chad Austin's avatar
      Drain ManualExecutor on destruction · a72a920c
      Chad Austin authored
      Summary:
      For use in tests where the executor has a nontrivial lifetime but any
      queued jobs should be completed, have ManualExecutor drain itself
      before it's destroyed.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8845457
      
      fbshipit-source-id: 7c2aa65aa27a7850ff73a93cfbe34c2248b62d26
      a72a920c
    • Aaryaman Sagar's avatar
      Remove const wlock acquisition · 37c011d8
      Aaryaman Sagar authored
      Summary:
      Change the write acquire interface to only acquire write locks on non-const
      `Synchronized` instances.  This reflects the intention of mutation associated
      with a write lock.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8851208
      
      fbshipit-source-id: 5be9d2e4a38d25632430a9b6c981b6e7f8412daa
      37c011d8
    • Dan Melnic's avatar
      Fix broken opt build due to "error: unused variable 'rv'" · 9793a0e7
      Dan Melnic authored
      Summary: Fix broken opt build due to "error: unused variable 'rv'"
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8883701
      
      fbshipit-source-id: 2a832cfea0bd9cbca63a8d5c2c8d7127593728af
      9793a0e7
    • Aaryaman Sagar's avatar
      Remove const folly::Synchronized upgrade lock acquire · ea29a7a6
      Aaryaman Sagar authored
      Summary: Users acquiring upgrade locks should only be allowed to lock the synchronized object when it is non-const.  Because an upgrade locks are permitted to transition to write locks when mutation is required.  At which point non-const access is often required on the Synchronized object.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8654360
      
      fbshipit-source-id: c2a6574bd880db0d8e4c90166e288f5b83542ad6
      ea29a7a6
  2. 17 Jul, 2018 2 commits
    • Nathan Bronson's avatar
      mark uses of folly::assume used to optimize placement new · 0aa15e94
      Nathan Bronson authored
      Summary:
      F14 currently has numerous places where folly::assume is used to
      help optimization on GCC < 6.  These are all things the optimizer should
      be able to deduce itself, so it would be nice to eventually remove them.
      This diff marks them with TODO(T31574848), as well as removing two
      occurrences in F14Table that duplicated an assume in F14Policy.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8849832
      
      fbshipit-source-id: e88143b4d29f1a633b51467206c6fb6afd1cd296
      0aa15e94
    • Nick Cooper's avatar
      Remove the ' ' prior to : in folly::json's pretty output. · 001320e2
      Nick Cooper authored
      Summary: Remove the ' ' prior to : in folly::json's pretty output - this improves consistency with other JSON formatters.
      
      Reviewed By: yfeldblum, luciang
      
      Differential Revision: D8843977
      
      fbshipit-source-id: 1d5c84d7d3806ad8752b619ffe23101f7f103683
      001320e2
  3. 16 Jul, 2018 2 commits
    • Maged Michael's avatar
      UnboundedQueue: Add cleanup of remaining items at destruction. · f96d7622
      Maged Michael authored
      Summary:
      - Add cleanup of remaining items, if any, at destruction.
      - Add test.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D8860966
      
      fbshipit-source-id: e3ab2e6ff31e08d91aa20c8c058471823c722a38
      f96d7622
    • Maged Michael's avatar
      hazptr: Add test to detect no reclamation, without calling cleanup. · c5f46707
      Maged Michael authored
      Summary: Add test to detect no reclamation (without calling hazptr_cleanup). The test retires a number of objects that would trigger bulk reclamation. One or more objects are expected be reclaimed. The number of retired objects must be greater than or equal to hazptr_domain::kThreshold to expect reclamation to happen.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8849957
      
      fbshipit-source-id: ef590af21a55348ed0ed72be3637853eceb21cbc
      c5f46707
  4. 14 Jul, 2018 5 commits
    • Marshall Cline's avatar
      remove lvalue-qual Future::get(...) · 0b1134d2
      Marshall Cline authored
      Summary:
      This is part of "the great r-valuification of folly::Future":
      
      * This is something we should do for safety in general.
      * Using lvalue-qualified `Future::get(...)` has caused some failures around D7840699 since lvalue-qualification hides that operation's move-out semantics - leads to some use of future operations that are really not correct, but are not obviously incorrect.
      * Problems with `Future::get(...) &`: it moves-out the result but doesn't invalidate the Future - the Future remains (technically) valid even though it actually is partially moved-out. Callers can subsequently access that moved-out result via things like `future.get()`, `future.result()`, `future.value()`, etc. - these access an already-moved-out result which is/can be surprising.
      * Reasons `Future::get(...) &&` is better: its semantics are more obvious and user-testable. It moves-out the Future, leaving it with `future.valid() == false`.
      * Note: `get(...)` refers to `get()` and `get(Duration)`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8710296
      
      fbshipit-source-id: ae201af1928eb2f6a2897c9b7db884393b36b910
      0b1134d2
    • Maged Michael's avatar
      hazptr: Fix hazptr_priv::push_all_to_domain to try reclamation when not in dtor · 41ed7dd9
      Maged Michael authored
      Summary: The most recent change had a bug that prevents all calls to hazptr_priv::push_all_to_domain from trying reclamation, instead of preventing that only when called from the destructor of hazptr_priv and during reclamation.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D8849738
      
      fbshipit-source-id: 15a27e8d4a88288179609e8cf179bc8c10c96b90
      41ed7dd9
    • Nathan Bronson's avatar
      optimize first insertion into F14 hash table · cf17895f
      Nathan Bronson authored
      Summary:
      This diff performs several micro-optimizations that improve
      the lifecycle of a single-element F14FastMap or F14FastSet by about 10%
      (in a single-threaded microbenchmark).  Lifecycle here means construction,
      insertion of one entry, and then destruction, so it includes one malloc
      and one free.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8771446
      
      fbshipit-source-id: 95d59f32de5a450b16ecdcb0e39b7f566ce797da
      cf17895f
    • Adam Simpkins's avatar
      logging: add XCHECK() and XDCHECK() macros · 5c438fac
      Adam Simpkins authored
      Summary:
      This adds `XCHECK()` and `XDCHECK()` macros to the folly logging library.
      These are similar to glog's `CHECK()` and `DCHECK()` macros, and should make
      it easier for users to convert from glog to folly logging.
      
      `XCHECK(condition)` is basically an alias for `XLOG_IF(FATAL, condition)`
      
      `XDCHECK(condition)` is like `XCHECK(condition)` in non-debug builds, but is
      compiled out entirely in debug builds.  Note that this is *not* like
      `XLOG_IF(DFATAL, condition)`, which still evaluates the condition but avoids
      crashing (logging the message only) in release builds.
      
      Reviewed By: mnv104
      
      Differential Revision: D8817270
      
      fbshipit-source-id: 86c4575e11af37219b30eda4e7e30273e1e32ab1
      5c438fac
    • Adam Simpkins's avatar
      logging: fix the behavior of XLOG_IF(FATAL, condition) · e8c31188
      Adam Simpkins authored
      Summary:
      Previously `XLOG_IF(FATAL, condition)` always crashed regardless of the
      condition check.  When `XLOG_IF()` was added it did not update the checks used
      to mark the statement as `[noreturn]` based on the log level.  As a result
      `XLOG_IF(FATAL, ...)` always used the `[noreturn]` APIs, even though this code
      can return if the condition is not true.
      
      This splits the `XLOG()` and `XLOG_IF()` implementations so that `XLOG(FATAL)`
      can still be marked as `noreturn` but `XLOG_IF(FATAL, ...)` is no `noreturn`.
      
      Reviewed By: yfeldblum, mnv104
      
      Differential Revision: D8817269
      
      fbshipit-source-id: 47a493eaaac69c563cff07da0888dd423f7dc07d
      e8c31188
  5. 13 Jul, 2018 7 commits
    • Chad Austin's avatar
      clang-format folly/executors/ · 056e121f
      Chad Austin authored
      Summary:
      Run clang-format across folly/executors/.
      
      ```
      find . \( -iname '*.cpp' -o -iname '*.h' \) -exec clang-format -i {} \;
      ```
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8843064
      
      fbshipit-source-id: 0a3c82083eebf2c684a4ab2e12067f0f742bf1d4
      056e121f
    • Louis Brandy's avatar
      make UtilityTest compile with c++17. · 1d2790bc
      Louis Brandy authored
      Summary:
      C++17 actually removes this overload of `std::addressof` to avoid taking the address of constants. It's not clear to me that the second test here is actually adding much value here.
      
      See (2) at: https://en.cppreference.com/w/cpp/memory/addressof
      
      Reviewed By: yfeldblum, elsteveogrande
      
      Differential Revision: D8775544
      
      fbshipit-source-id: a42209484574509f4d032ebbdf05430f0ed372c4
      1d2790bc
    • Adam Simpkins's avatar
      logging: make IntervalRateLimiter constexpr-constructible · 1e877625
      Adam Simpkins authored
      Summary:
      This changes `IntervalRateLimiter` to allow it to be `constexpr`-constructible.
      
      We now always initialize the `timestamp_` field to 0.  The very first call to
      `check()` will now always call `checkSlow()` which will then initialize
      `timestamp_` properly.
      
      This also removes the pure virtual `RateLimiter` interface class.  At the
      moment `IntervalRateLimiter` is the only implementation, and all call sites
      use this class directly.  We can always add the `RateLimiter` interface back
      in the future if we need it later.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8798167
      
      fbshipit-source-id: 80885a16506a8daa67653bd0a92accae7a973289
      1e877625
    • Adam Simpkins's avatar
      logging: reformat fatal_test.py with black · 16ae8fd4
      Adam Simpkins authored
      Summary: Reformat fatal_test.py with black (https://github.com/ambv/black)
      
      Reviewed By: mnv104
      
      Differential Revision: D8817268
      
      fbshipit-source-id: b642496ac61e3b2120b76d9b234c29bf51603651
      16ae8fd4
    • Adam Simpkins's avatar
      logging: update some static lambda variable names · 7af069c3
      Adam Simpkins authored
      Summary:
      Update the static local variable names used in `XLOG_IMPL()` and
      `XLOG_IS_ON_IMPL()` to match the naming style used in D8218663.
      
      The current version of clang-format also appears to be able to format
      `XLOG_IMPL()` correctly now, so remove the comments disabling it around this
      macro body.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8816625
      
      fbshipit-source-id: 155b759953de5d5db0b350f27870edf9f5516914
      7af069c3
    • Adam Simpkins's avatar
      logging: Add rate limiting log macros · 130fca21
      Adam Simpkins authored
      Summary:
      This adds several macros for explicitly rate-limited log messages.
      
      - `XLOG_EVERY_N()` logs only 1 of every N times it is called.
        This is similar to glog's `LOG_EVERY_N()` and `VLOG_EVERY_N()` macros.
      
      - `XLOG_EVERY_MS()` logs only once per specified time interval.
        This is similar to the `LOG_EVERY_MS()` and `LOG_EVERY_MS_ATOMIC()` macros
        that Facebook has defined internally on top of glog.
      
      - `XLOG_N_PER_MS()` logs the first N messages per specified time interval.
      
      These should make it easier for Facebook programs to migrate from glog to
      xlog.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8218663
      
      fbshipit-source-id: a1e71265ace41fea95e5dbb79bc4381962b11297
      130fca21
    • Dave Watson's avatar
      Revert D8397670 D8797823 · 3d61f8ac
      Dave Watson authored
      Summary:
      Delayed hazptr destruction is causing destruction ordering issues.
      
      P59812860$445
      
      buck test //titan/cachius/test:CachiusServiceHandlerTest
      
      Reviewed By: phil-lopreiato
      
      Differential Revision: D8825716
      
      fbshipit-source-id: 808341489fd80b8edb63eb7c12377a8ffadfd1eb
      3d61f8ac
  6. 12 Jul, 2018 5 commits
    • Andrii Grynenko's avatar
      Make fibers::Baton awaitable · 2c76542e
      Andrii Grynenko authored
      Summary:
      This extends fibers::Baton to support any awaiter (not just folly::Fiber) which makes it possible to integrate it with coroutines.
      This will make it easy to integrate existing synchronization primitives that use fibers::Baton with coroutines.
      
      Reviewed By: lewissbaker
      
      Differential Revision: D8580775
      
      fbshipit-source-id: 8f8593793d3012e0470b8f9b3bcf2713145d3573
      2c76542e
    • Maged Michael's avatar
      hazptr: Prevent destructor of hazptr_priv from getting reference to itself · 4bfcf7b4
      Maged Michael authored
      Summary: Prevent destructor of hazptr_priv which is a SingltonThreadLocal from making call to get a reference to the singlton. This may be a problem on some platforms.
      
      Reviewed By: djwatson
      
      Differential Revision: D8711918
      
      fbshipit-source-id: fb319f640cff74e46ce27ab28ae5fbf93961b262
      4bfcf7b4
    • Nathan Bronson's avatar
      IsAvalanchingHasher improvements and fixes · fb02412a
      Nathan Bronson authored
      Summary:
      Specializing folly::IsAvalanchingHasher can be bulky and
      mistake-prone, such as constructing a new hash functor by subclassing.
      For example, folly::IsAvalanchingHasher<folly::transparent<H>, K>
      was incorrectly false even when H is avalanching.  This diff adds the
      ability to use a member type is_avalanching to accomplish the same
      effect, and also fixes the computation of folly::IsAvalanchingHasher
      for folly::transparent.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8772423
      
      fbshipit-source-id: 49e4e33b2981efd8c302d9a217dc9df0dcb290cc
      fb02412a
    • Sven Over's avatar
      also test Function move construction from empty Function · 39ef9832
      Sven Over authored
      Summary: The `Emptiness_T` test already tests the emptiness of a default-constructed Function as well as one that was assigned an empty Function. This diff adds a test for a Function that was move-constructed from an empty Function.
      
      Reviewed By: shixiao
      
      Differential Revision: D8818468
      
      fbshipit-source-id: 3f0e04b9f0f44df2de45fc972a2d26e12adc7362
      39ef9832
    • Nathan Bronson's avatar
      remove unnecessary folly:: qualification in F14 · 787dc636
      Nathan Bronson authored
      Summary: F14 code inside namespace folly doesn't need folly::
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8772565
      
      fbshipit-source-id: 720fa683b7ec9be9a096559191240ef7e672fe3e
      787dc636
  7. 11 Jul, 2018 9 commits
    • Yedidya Feldblum's avatar
      Reorder includes in folly/io/async/HHWheelTimer.cpp · c1c59c5b
      Yedidya Feldblum authored
      Summary: [Folly] Reorder `#include`s in `folly/io/async/HHWheelTimer.cpp`.
      
      Reviewed By: djwatson
      
      Differential Revision: D8806020
      
      fbshipit-source-id: 43496acdaac3b8a79169b00913881d17d160906c
      c1c59c5b
    • Dave Watson's avatar
      Summary: · f8e888a0
      Dave Watson authored
      Fix requestcontext destruction before globals are destroyed.
      Bad stacktrace P59804825
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8797823
      
      fbshipit-source-id: a9cbff159e5a0ab2577cb7412817be5d554aa32f
      f8e888a0
    • Marshall Cline's avatar
      deprecate rvalue-qual Future::get(...) · acd11b42
      Marshall Cline authored
      Summary:
      This is part of "the great r-valuification of folly::Future":
      
      * This is something we should do for safety in general.
      * Context: `Future::get(...)` means both `Future::get()` and `Future::get(Duration)`
      * Using lvalue-qualified `Future::get(...)` has caused some failures around D7840699 since lvalue-qualification hides that operation's move-out semantics - leads to some use of future operations that are really not correct, but are not obviously incorrect.
      * Problems with `Future::get(...) &`: it moves-out the result but doesn't invalidate the Future - the Future remains (technically) valid even though it actually is partially moved-out. Callers can subsequently access that moved-out result via things like `future.get(...)`, `future.result()`, `future.value()`, etc. - these access an already-moved-out result which is/can be surprising.
      * Reasons `Future::get(...) &&` is better: its semantics are more obvious and user-testable. It moves-out the Future, leaving it with `future.valid() == false`.
      
      Reviewed By: LeeHowes
      
      Differential Revision: D8799081
      
      fbshipit-source-id: 890a221c84ba4847abfaf6e564b0eceb0176fd54
      acd11b42
    • Jack Montgomery's avatar
      Add data() method to folly sorted vector types · c8eeea45
      Jack Montgomery authored
      Summary: Add a data() method to folly::sorted_vector_map and folly::sorted_vector_set which returns a const pointer to the underlying container's data
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8750840
      
      fbshipit-source-id: d361fe21ac741b31b60f551935a3ed8c9549f11a
      c8eeea45
    • Yao Han's avatar
      fix zstd macro (#885) · 16b84942
      Yao Han authored
      Summary:
      detect FOLLY_HAVE_LIBZSTD by true/false
      Pull Request resolved: https://github.com/facebook/folly/pull/885
      
      Reviewed By: terrelln
      
      Differential Revision: D8807276
      
      Pulled By: yfeldblum
      
      fbshipit-source-id: 4372b925a487a31b26cc4c59d7f513639d864f00
      16b84942
    • Sven Over's avatar
      Fast-path destructor · 9ee00d31
      Sven Over authored
      Summary:
      Optimise the destruction of default-constructed and moved-out Function objects. Instead of calling a function pointer that is set to a no-op function, use `nullptr` to signal emptyness of that function pointer and check if it is `nullptr` before invoking.
      This adds additional branching in a few places: not only in the destructor, but also in the move constructor, as well as in the little used `hasAllocatedMemory`. The effect of getting rid of calls to a no-op function pointer should outweigh that.
      
      Reviewed By: djwatson
      
      Differential Revision: D8694003
      
      fbshipit-source-id: 42972805b2ade255cf1dcc98e54985b1524daa73
      9ee00d31
    • Andrii Grynenko's avatar
      Add support for types that implement operator co_await() · 73a507a2
      Andrii Grynenko authored
      Summary: AwaitWrapper was previously only working with types which are Awaitable (i.e. have await_ready()/await_suspend()/await_resume()). This extends it to support types which have operator co_await() implemented.
      
      Reviewed By: lewissbaker
      
      Differential Revision: D8580759
      
      fbshipit-source-id: 980f9c9f34c5a2302badb2ab7c4644883b14aa2c
      73a507a2
    • Lars T. Kyllingstad's avatar
      Prevent bzlib.h from pulling in min and max macros (#884) · 48a252cf
      Lars T. Kyllingstad authored
      Summary:
      This fixes issue #882. Ping terrelln.
      Pull Request resolved: https://github.com/facebook/folly/pull/884
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8794382
      
      Pulled By: terrelln
      
      fbshipit-source-id: 52d8a02991d2be401464ed3cd383a45230ba8ca7
      48a252cf
    • Alfredo Altamirano's avatar
      Assert that we can't construct centroid with weight <= 0 · c33ac44d
      Alfredo Altamirano authored
      Summary:
      We should not be able to create tdigest centroids with weight <= 0.
      Added a debug assert to ensure this.
      
      Differential Revision: D8786969
      
      fbshipit-source-id: 738f2c8d00596365363ea7be88c759da881ab770
      c33ac44d
  8. 10 Jul, 2018 2 commits
    • Dave Watson's avatar
      Use hazptr in RequestContext · c0efc2be
      Dave Watson authored
      Summary:
      Instead of a reader-writer lock in RequestContext data_, use an allocation + hazptr.
      This improves setContext/saveContext perf at the expense of setData.
      
      Differential Revision: D8397670
      
      fbshipit-source-id: 105fd715f1eb09499c88d1a205f019ae01a54f13
      c0efc2be
    • Louis Brandy's avatar
      fix OptionalTest for gcc7 · 6e707da9
      Louis Brandy authored
      Summary: This is horrifying. `std::make_optional` is visible w/o `using` anything, making the use of `make_optional` here ambiguous.
      
      Reviewed By: yfeldblum, elsteveogrande
      
      Differential Revision: D8775609
      
      fbshipit-source-id: 4f1162958909dfab603d2c61473155555a05e9d2
      6e707da9
  9. 09 Jul, 2018 1 commit
    • Wilhelm Bierbaum's avatar
      Add accessor to read connection establishment time-point · 4548dadb
      Wilhelm Bierbaum authored
      Summary:
      In furtherance of advancing connection conditioning in dependent code, the
      time-point which a connection was established can be read through an
      accessor.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8669627
      
      fbshipit-source-id: 156924689354d7a19188f4873009e678a68be64b
      4548dadb
  10. 07 Jul, 2018 1 commit
    • Aaryaman Sagar's avatar
      forward_tuple · 4aeeb1f6
      Aaryaman Sagar authored
      Summary:
      Given a tuple, return a tuple of references whose value categories are derived
      from the value category of the input tuple
      
      Given this, revert to the exact behavior `MQTTChannel` had prior to D8248199.
      
      Reviewed By: mzlee
      
      Differential Revision: D8698755
      
      fbshipit-source-id: c9b68a3f344c6bae25f612a38f5c22be9b7f87bc
      4aeeb1f6