1. 29 Jun, 2018 4 commits
    • 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
  2. 28 Jun, 2018 6 commits
    • 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
    • Steve O'Brien's avatar
      folly: iterator classes (1/3): add minimal facade/adaptor classes + test · 55ec604d
      Steve O'Brien authored
      Summary:
      Iterator helper classes are used in several places around Folly; they're convenient because they take care of some of the details while letting your class provide only a few of the necessary pieces.
      
      Boost has `iterator_facade` and `iterator_adaptor` to help in these cases, but the header for these classes are absurdly expensive to include (their transitive includee tree is quite large).
      
      For this reason, we'll add similar helper classes, with minimal dependencies, under detail.  In subsequent diffs we'll migrate some existing code using these boost classes (or implementing iterators itself) to use these helpers.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8345073
      
      fbshipit-source-id: 3e6656e544349fe228358074de30c89c805e2628
      55ec604d
    • Yedidya Feldblum's avatar
      Fix incorrect copy constructions in ConcurrentHashMap · 3f12b5ad
      Yedidya Feldblum authored
      Summary: [Folly] Fix incorrect copy constructions in `ConcurrentHashMap`, where the `ConstIterator` is move-only but the code attempts to copy it.
      
      Reviewed By: magedm
      
      Differential Revision: D8678003
      
      fbshipit-source-id: 89d47b811fb27ecbbd42cae03a2af13becd0082a
      3f12b5ad
    • Yedidya Feldblum's avatar
      invoke_type members for free- and member-invoke traits containers · f7afb2cc
      Yedidya Feldblum authored
      Summary:
      [Folly] `invoke_type` members for free- and member-invoke traits containers.
      
      Usable as:
      
      ```
      FOLLY_CREATE_FREE_INVOKE_TRAITS(swap_invoke_traits, swap, std);
      // ...
      swap_invoke_traits::invoke_type my_swap;
      my_swap(obj1, obj2);
      
      Reviewed By: aary
      
      Differential Revision: D8670799
      
      fbshipit-source-id: 0c24912721aa20ca9647261e24ed3eb0e340ab20
      f7afb2cc
    • Yedidya Feldblum's avatar
      Refactor apply-invoke traits · 23bb52a4
      Yedidya Feldblum authored
      Summary:
      [Folly] Refactor apply-invoke traits. Can make them smaller by extracting a common denominator and then falling back on the base invoke traits.
      
      Also fixes the build for MSVC2015.
      
      Reviewed By: aary
      
      Differential Revision: D8676590
      
      fbshipit-source-id: f59c7014d3294f3b0978c2fd027cf3a87411f639
      23bb52a4
    • Jon Maltiel Swenson's avatar
      Handle EINVAL errno in MemoryIdler::unmapUnusedStack() · 20d52e14
      Jon Maltiel Swenson authored
      Summary:
      If `MemoryIdler` is used with threads that are backed by huge pages, the
      `madvise(..., MADV_DONTNEED)` calls will fail with an `EINVAL`. Prior to this
      diff, this would lead to an assertion failure. Now, if `EINVAL` is returned, we
      warn the user, as `MemoryIdler` may not be able to function as expected.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8669399
      
      fbshipit-source-id: f97ea7549deffdbf283b3516b9e8feafe18a036c
      20d52e14
  3. 27 Jun, 2018 12 commits
    • Yedidya Feldblum's avatar
      Simpler free-invoke traits · aeeb73ac
      Yedidya Feldblum authored
      Summary: [Folly] Simpler free-invoke traits. Only supports one namespace housing a base definition. For the typical case of `swap`, with a base definition in `namespace std`, this works.
      
      Reviewed By: aary
      
      Differential Revision: D8666221
      
      fbshipit-source-id: abfd302e430ad7151c119e98a706201265d302d3
      aeeb73ac
    • Dan Melnic's avatar
      Make the pthread key a singleton · a65e66ab
      Dan Melnic authored
      Summary: Make the pthread key a singleton
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8663589
      
      fbshipit-source-id: 1e0c328104bd8c3d3c689dc4955a185336e74276
      a65e66ab
    • Phil Willoughby's avatar
      don't throw in noexcept function · 1e274dc6
      Phil Willoughby authored
      Summary:
      `throw` within a `noexcept` function triggers a compiler warning on the latest clang in C++17 mode.
      
      As the behavior of uncaught `throw` within a `noexcept` context is to terminate the program, do so explicitly.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8651221
      
      fbshipit-source-id: 004c4c132ad9b5b873a92cf2710b9d1ebe4e705b
      1e274dc6
    • Aaryaman Sagar's avatar
      Cut LockedGuardPtr and its variants · 78cd0ec8
      Aaryaman Sagar authored
      Summary:
      The compiler will likely remove the branch on destruction because
      it's never used
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8651868
      
      fbshipit-source-id: ef16b9d11569f72aa0fa89cb6aa2450a58d783e7
      78cd0ec8
    • Nathan Bronson's avatar
      fix elision of iter advance in F14 erase with unused return value · 4029908d
      Nathan Bronson authored
      Summary:
      D8395569 added a prefetch instruction as part of iterator advance
      for F14Value and F14Node maps.  This caused the work to advance the
      iterator returned by erase to no longer be recognized as dead code by the
      GCC optimizer.  This diff separates out advance() and advanceLikelyDead()
      methods, avoiding prefetch in the latter case.
      
      Reviewed By: shixiao
      
      Differential Revision: D8656038
      
      fbshipit-source-id: 86cecf40e8622f815d34a98709b90d6ef73dd618
      4029908d
    • Nathan Bronson's avatar
      handle allocators with only explicit rebinding constructor · a99ccb8b
      Nathan Bronson authored
      Summary:
      D8586283 added an implicit conversion from allocator_type to a
      uint8_t-rebound allocator, but allocators might provide only an explicit
      rebinding constructor.  This diff makes F14 use the explicit form.
      It also adds a binary that when debugged (in a buck build environment)
      is useful for evaluating code size.
      
      Reviewed By: shixiao
      
      Differential Revision: D8655289
      
      fbshipit-source-id: c977edb041ce2056f3ce23c52a7f8464a6b9f1bd
      a99ccb8b
    • Andrew Gallagher's avatar
      folly: fix some missing standard library includes · 91a001f0
      Andrew Gallagher authored
      Reviewed By: igorsugak
      
      Differential Revision: D8653359
      
      fbshipit-source-id: 5bb33792aa96a0ed7f88a672100955f366c568da
      91a001f0
    • Yedidya Feldblum's avatar
      Free function invoke traits · 8bb0e678
      Yedidya Feldblum authored
      Summary: [Folly] Free function invoke traits.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D8632204
      
      fbshipit-source-id: 1f5f6e31072ef3a711edab02b6b7bbad8c894a95
      8bb0e678
    • Yedidya Feldblum's avatar
      Tweaks to member-invoke traits · ae87e1d0
      Yedidya Feldblum authored
      Summary:
      [Folly] Tweaks to member-invoke traits.
      * `const`.
      * No need to delegate to `invoke`.
      
      Reviewed By: aary
      
      Differential Revision: D8632393
      
      fbshipit-source-id: 08ae3bc6e3ede3766ec646a5d2588996ff734538
      ae87e1d0
    • Maged Michael's avatar
      hazptr: Disable detection of frequent calls to hazptr_tc::fill · aacb17f6
      Maged Michael authored
      Summary: To avoid affecting existing use cases that were caught by the check.
      
      Reviewed By: itomatik
      
      Differential Revision: D8657069
      
      fbshipit-source-id: 55a54022c5d5bc4a5d332270df7f2fa9a9b5e05e
      aacb17f6
    • Maged Michael's avatar
      hazptr: Increase the thread cache capacity to 9 hazard pointers · 252e7237
      Maged Michael authored
      Summary: To accommodate a use case.
      
      Reviewed By: itomatik
      
      Differential Revision: D8656154
      
      fbshipit-source-id: 9d2961d7921bdd399fc8c46820d1ba3aa5006c6f
      252e7237
    • Anton Likhtarov's avatar
      Initial support for user-defined types · 4b5d7fec
      Anton Likhtarov authored
      Summary:
      The type must provide a StringPiece constructor or be convertible
      via `folly::to<UserDefinedType>(string)`; toAppend() must also be defined for
      the reverse construction.
      
      Differential Revision: D8586230
      
      fbshipit-source-id: 80159bc1cc9d32f0ae40af8f053387f341bea835
      4b5d7fec
  4. 26 Jun, 2018 12 commits
    • Dan Melnic's avatar
      Use FOLLY_EXPORT for StaticMetaBase::getThreadEntryList() · c2040e01
      Dan Melnic authored
      Summary: Use FOLLY_EXPORT for StaticMetaBase::getThreadEntryList()
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8640044
      
      fbshipit-source-id: 0907af4b091681a986ac2b0e963bc1c5258dd5c1
      c2040e01
    • Aaryaman Sagar's avatar
      Add analogue of invoke_ family of traits for apply() · 39e1a6e9
      Aaryaman Sagar authored
      Summary:
      Similar to the invoke family of traits
      https://en.cppreference.com/w/cpp/types/is_invocable, this introduces the same
      for the case where arguments are wrapped in a tuple
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8626830
      
      fbshipit-source-id: 145eb71c7bb142ff07ebad716572b5e8340d2c9c
      39e1a6e9
    • Maged Michael's avatar
      hazptr: Detect frequent calls to hazptr_tc::fill · a71bd7f2
      Maged Michael authored
      Summary: Detect frequent calls to hazptr_tc::fill. This is usually indicative of unnecessary overhead, either due to insufficient thread cache capacity for legitimate use cases, or due to unnecessary allocation of extra hazard pointers in user code.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8606484
      
      fbshipit-source-id: e75223f8bc3e180a1ee651ee2989522d6b0a89df
      a71bd7f2
    • Aaryaman Sagar's avatar
      index_sequence_for_tuple · 3fa2e787
      Aaryaman Sagar authored
      Summary: A simple helper to construct an index sequence from a given tuple type
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8626776
      
      fbshipit-source-id: a4ea412293981d58e91a921dcae8468849f5f0bf
      3fa2e787
    • Marc Celani's avatar
      Fix a build failure · 2826a4e8
      Marc Celani authored
      Summary: As title
      
      Reviewed By: elsteveogrande
      
      Differential Revision: D8643234
      
      fbshipit-source-id: 989cdc53ed071fd78a1eba4b2955eff7651274f1
      2826a4e8
    • Maged Michael's avatar
      ConcurrentHashMap: Make iterators not copyable · 8cb68e8d
      Maged Michael authored
      Summary: Disable unsafe iterator operations: copying and operator++ (because it copies the iterator). Copying is unsafe because starting to protect buckets and nodes after their removal is not guaranteed to be effective.
      
      Reviewed By: yfeldblum, djwatson
      
      Differential Revision: D8594743
      
      fbshipit-source-id: 0990d8fe979a3217db855641d23e24cc853a25bf
      8cb68e8d
    • Aaryaman Sagar's avatar
      Backport std::apply and remove folly::applyTuple · 23817ea8
      Aaryaman Sagar authored
      Summary:
      Add a backport of `std::apply` with a similar implementation that makes it easy
      to reason about.  Also implement `applyTuple` in terms of `apply`, `invoke` and
      `tuple_cat`
      
      The implementation of `apply` has been taken straight from the standard,
      reducing chances of churn in incompatible assumptions (if any).  Note that the
      definition and declaration of `apply` has been changed from the way it is
      specified in the standard for better SFINAE compatibility, if needed, will
      followup with a paper proposing the same change in the standard
      
      Reviewed By: spacedentist
      
      Differential Revision: D8248199
      
      fbshipit-source-id: e3e76193a30b1599eca3fe986a33f61addad7a59
      23817ea8
    • Aaryaman Sagar's avatar
      Leftover occurences of integral_constant<bool, ...> · f6f9d7ea
      Aaryaman Sagar authored
      Summary: title
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8631916
      
      fbshipit-source-id: be4ef689b9c2b0dcdd92f8ea61787f70f9a71f9c
      f6f9d7ea
    • Nathan Bronson's avatar
      use vector intrinsics for F14 on 32-bit platforms · 27929e3d
      Nathan Bronson authored
      Summary:
      This diff adds 32-bit support for F14, so SSE and NEON
      intrinsics can be used on x86 and arm architectures (rather than just
      x86_64 and aarch64).  The portability fallback to std::unordered_map
      and std::unordered_set is now used only when vector intrinsics are not
      available, or on PPC.
      
      Reviewed By: shixiao
      
      Differential Revision: D8586283
      
      fbshipit-source-id: 1c4d090e80381fe7ad071c3059b3cb242c04c9f7
      27929e3d
    • Nathan Bronson's avatar
      helper methods for over-aligned allocation with C++ allocators · 3cb1c6d0
      Nathan Bronson authored
      Summary:
      This diff adds helper methods for allocating
      possibly-over-aligned types using C++ allocators.  It uses one of three
      strategies:
      
      * REBINDING - When there is a type that is not over-aligned with the
      requested alignment, the allocator is rebound to that a type with the
      correct alignment (this allows allocating 1 char with alignment 8,
      for example).
      
      * BYPASSING - When the requested alignment is larger than max_align_t
      but the standard allocator is in use, the allocator is bypassed and
      aligned_malloc/aligned_free are used directly to manage the allocation.
      
      * OVER-ALLOCATING - When the type is truly over-aligned and the allocator
      is custom, extra memory is requested and a delta is stored before the
      returned memory to allow the original base location to be recovered.
      
      Reviewed By: shixiao
      
      Differential Revision: D8592767
      
      fbshipit-source-id: 487b5ff7f7f6b1b29a3f2a80d07129afd50bda24
      3cb1c6d0
    • Maged Michael's avatar
      hazptr: Increase thread cache capacity · abef2f07
      Maged Michael authored
      Summary: Increase thread cache capacity from 3 to 6 hazard pointers to accommodate 2 ConcurrentHashMap iterators.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8595800
      
      fbshipit-source-id: 53275c3cf6fb11c976a4da987d79ec33b9e5e617
      abef2f07
    • Maged Michael's avatar
      ConcurrentHashMap: Make iterators movable · 1f6bf6c8
      Maged Michael authored
      Summary:
      To reduce unnecessary copying for user code handling ConstIterator-s.
      
      Added move test and change UpdateStressTest to use few concurrent iterators.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8587056
      
      fbshipit-source-id: d6b592a3aa40ca8a7599b258b45a1d339088c978
      1f6bf6c8
  5. 25 Jun, 2018 4 commits
    • Aaryaman Sagar's avatar
      Remove Synchronized::asConst · 3af92dbe
      Aaryaman Sagar authored
      Summary: `folly::as_const` instead
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8248219
      
      fbshipit-source-id: 22853d86c93065ee584458f18b7cd0e8d528d2f0
      3af92dbe
    • Dan Melnic's avatar
      Faster thread local iteration using the ThreadEntryNode · fa32adfe
      Dan Melnic authored
      Summary: Faster thread local iteration using the ThreadEntryNode
      
      Reviewed By: djwatson
      
      Differential Revision: D8551597
      
      fbshipit-source-id: 9118852c0a823851a95b63fe807bfc2679112beb
      fa32adfe
    • Marshall Cline's avatar
      modernize Future::get(): 2/n = 'our' tests use only rvalue-get() · 0a1b8f18
      Marshall Cline authored
      Summary:
      Change the folly/future/... tests to use mainly[*] the rvalue-qualified versions of get() and get(dur).
      
      [*] Although the lvalue-qualified get is deprecated, it is not yet removed, so this diff leaves a test for the lvalue-qualified version. But the bulk of the tests are for the rvalue-qualified get.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8239792
      
      fbshipit-source-id: c8a2e90cb5ab97a59ec97994c8c6a6ca27dab86e
      0a1b8f18
    • Yedidya Feldblum's avatar
      Fix forwarding/moving in Futures reduce · 7a960981
      Yedidya Feldblum authored
      Summary: [Folly] Fix forwarding/moving in Futures `reduce`.
      
      Reviewed By: marshallcline
      
      Differential Revision: D8601105
      
      fbshipit-source-id: 96c1632821e9e5088a900ccecdaff9f8d108b905
      7a960981
  6. 24 Jun, 2018 2 commits
    • Andrii Grynenko's avatar
      Fix collectAllSemiFuture to work for SemiFutures with deferred work · 7a111f40
      Andrii Grynenko authored
      Summary: We have to extend DeferredExecutor to be aware of nested DeferredExecutor, so that it can propagate various signals to them.
      
      Reviewed By: LeeHowes
      
      Differential Revision: D8600961
      
      fbshipit-source-id: 2b9520598cad65bd80f0346e6f76e224903780a1
      7a111f40
    • Yedidya Feldblum's avatar
      Let Futures Barrier::ControlBlock ctor fully construct · 3bb85dae
      Yedidya Feldblum authored
      Summary:
      [Folly] Let Futures `Barrier::ControlBlock` ctor fully construct.
      
      Invoke the constructor when allocating the control block, rather than try to initialize each field afterward.
      
      Differential Revision: D8605292
      
      fbshipit-source-id: d51648a1267ed7e3e13d9a9e8d8e5d1c18e24a98
      3bb85dae