1. 13 Jul, 2018 5 commits
    • 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 06 Jul, 2018 1 commit
  8. 05 Jul, 2018 2 commits
    • Marshall Cline's avatar
      use rvalue-qual Future::get(): pass 5 · 964d9f48
      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: djwatson
      
      Differential Revision: D8711357
      
      fbshipit-source-id: 7b6a4119f4427fbc779b1f9e1c0dd44762021894
      964d9f48
    • Mark Santaniello's avatar
      const-qualify some data members · 01920134
      Mark Santaniello authored
      Summary: The `size_` and `upperBound_` fields can be const-qualified.
      
      Reviewed By: ot
      
      Differential Revision: D8734943
      
      fbshipit-source-id: ced8a7c96442772a37bb8be373c71b557598257f
      01920134
  9. 03 Jul, 2018 2 commits
    • Aaryaman Sagar's avatar
      Add missing LockedPtr template constructor · dc4e8512
      Aaryaman Sagar authored
      Summary:
      `LockedPtr`s were not constructible from other `LockedPtr`s with different
      lock policies even if their unlock policies were the same.
      
      Fix that.
      
      Reviewed By: simpkins
      
      Differential Revision: D8722292
      
      fbshipit-source-id: bf17f86bef9ceb8e994a2bd01e66d61dbd51bb12
      dc4e8512
    • Alexander Kindyakov's avatar
      Fix up typo in tryTo<> for enums · 40fb25b3
      Alexander Kindyakov authored
      Summary: This diff fixes the typo in `tryTo` declaration for `enum`s and adds test coverage for enum specialization.
      
      Reviewed By: yfeldblum, shixiao
      
      Differential Revision: D8694574
      
      fbshipit-source-id: d20e34d7d7bae7805cc7c31507cffb292235bdfc
      40fb25b3
  10. 01 Jul, 2018 1 commit
  11. 30 Jun, 2018 3 commits
    • Marshall Cline's avatar
      use rvalue-qual Future::get() · 110882c8
      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`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8704033
      
      fbshipit-source-id: 246f35c6320425e4b76ad11882bf55169988b772
      110882c8
    • Max Katsev's avatar
      alias folly::apply to std::apply on C++17 · 2e7e90e4
      Max Katsev authored
      Summary: Previously this code failed to build due to ambiguity between folly::apply and std::apply
      
      Reviewed By: aary, ot, luciang
      
      Differential Revision: D8705541
      
      fbshipit-source-id: 575c52517792a930d3639b39eba4abc352739d6f
      2e7e90e4
    • Teng Qin's avatar
      Add empty semaphore Macro for non-x86 archs · 9dfd1bda
      Teng Qin authored
      Summary: When people using Static Tracepoint with Semaphore, they'll need to define / declare it. That would cause error on non-supported platforms. This Diff adds empty statement for them.
      
      Reviewed By: myreg
      
      Differential Revision: D8706499
      
      fbshipit-source-id: 2978faf08c451d19e44156308d896e7cac83fcc7
      9dfd1bda
  12. 29 Jun, 2018 7 commits
    • Aaryaman Sagar's avatar
      Add folly::synchronized · 9bcfbd09
      Aaryaman Sagar authored
      Summary:
      Some people said the read-lock-when-const behavior of the `SYNCHRONIZED` macro
      was desirable, so instead of codemodding the `SYNCHRONIZED` macros out of
      existence in favor of `withRLock`, `withWLock` and `withLock`, add a
      generalization of the `SYNCHRONIZED()` macros, so they can be removed in favor
      of this, which has identical behavior while being more general.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8248203
      
      fbshipit-source-id: eb3c1444182e42bea79a377a66606d91a6e517bd
      9bcfbd09
    • Steve O'Brien's avatar
      folly: iterator classes (3/3): IOBuf's custom iterator should use new Iterator detail classes · cd8d5de0
      Steve O'Brien authored
      Summary: IOBuf's custom iterator was changed so that it would no longer need `<boost/iterator_facade.hpp>`.  Change again so that it uses Folly's own (cheap) header file providing roughly the same functionality.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8345072
      
      fbshipit-source-id: bbbfb4373e72444a5e54aeccafd2d316ebdbae63
      cd8d5de0
    • Dave Watson's avatar
      Don't zero-initialize Data · 46dd483d
      Dave Watson authored
      Summary:
      Don't zero-initialize Data.  It's already set in all the constructors we care about,
      and gcc generates pretty aweful code for this.
      
      Reviewed By: ot, spacedentist
      
      Differential Revision: D8678393
      
      fbshipit-source-id: 55a46f3db376ba1f9aa8100f176fd7d8ac18275c
      46dd483d
    • Dave Watson's avatar
      Add move benchmarks · fdf8fee8
      Dave Watson authored
      Summary:
      Adds two benchmarks for small create/move/invoke,
      and both small and large for move, and function ptr move.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8678386
      
      fbshipit-source-id: c78c493587df5d960b603178147d591489c7f519
      fdf8fee8
    • Andrii Grynenko's avatar
      Disable future unwrapping in SemiFuture::defer(Value/Error) · d28b94ab
      Andrii Grynenko authored
      Summary: Future unwrapping in defer is broken for incomplete Futures and SemiFutures with deferred work.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8675535
      
      fbshipit-source-id: 8deff362ea018cf4717354cd973756161c4249aa
      d28b94ab
    • Marshall Cline's avatar
      use rvalue-qual Future::get(): pass 3 · 860b718e
      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`.
      
      Codemod steps (where `get(...)` means both `Future::get()` and `Future::get(Duration)`):
      
      * expr.get(...) ==> std::move(expr).get(...)  // if expr is not already an xvalue
      * expr->get(...) ==> std::move(*expr).get(...)
      
      Note: operator precedence of that last step is safe - no need to parenthesize `expr`. Reason: `->` binds more tightly than unary `*`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8683752
      
      fbshipit-source-id: 593bcd92ca4e11244e0f912cf956538889a2c777
      860b718e
    • Larry-Hu's avatar
      Enable _ENABLE_EXTENDED_ALIGNED_STORAGE to use an extende alignment (#881) · 3dd3467e
      Larry-Hu authored
      Summary:
      We built folly with upcoming Visual Studio 15.8, which failed with the following message:
      error C2338: You've instantiated std::aligned_storage<Len, Align> with an extended alignment (in other words, Align > alignof(max_align_t)). Before VS 2017 15.8, the member type would non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to handle this correctly, but the fix inherently changes layout and breaks binary compatibility (only for uses of aligned_storage with extended alignments). Please define either (1) _ENABLE_EXTENDED_ALIGNED_STORAGE to acknowledge that you understand this message and that you actually want a type with an extended alignment, or (2) _DISABLE_EXTENDED_ALIGNED_STORAGE to silence this message and get the old non-conformant behavior.
      
      This enables the `_ENABLE_EXTENDED_ALIGNED_STORAGE`.
      
      Closes https://github.com/facebook/folly/pull/881
      
      Reviewed By: Orvid
      
      Differential Revision: D8689152
      
      Pulled By: yfeldblum
      
      fbshipit-source-id: fada301a163b0b09adc76807dc0e7bd26d9740a9
      3dd3467e
  13. 28 Jun, 2018 1 commit
    • Steve O'Brien's avatar
      folly: iterator classes (2/3): avoid expensive boost iterator headers in `dynamic` · 9dd60503
      Steve O'Brien authored
      Summary:
      In the same vein as some previous diffs: some `boost` headers are expensive.  These `iterator_facade` and related headers (which include -facade.h) are examples of super expensive ones.
      
      `boost/iterator/iterator_adaptor.hpp` in particular shows up as being responsible for appx. 7.5% (avg) of translation units built.
      
      The solution here is: since this bloats `folly/dynamic-inl.h`, in that "private" impl file, I added a workalike class, which is minimal and works well enough to do the job for dynamic's iterators.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8329532
      
      fbshipit-source-id: deaab7b52d110cd29c613d687a6a74c6a42b515d
      9dd60503