1. 31 May, 2018 9 commits
    • Maged Michael's avatar
      UnboundedQueue: Make linking next, advancing tail, and advancing head wait-free · 40a62d63
      Maged Michael authored
      Summary:
      Avoid spin-waiting for threads that may be descheduled by making steps that used to require waiting for action by a specific thread wait-free. The changed steps are:
      - Allocating and linking the next segment
      - Advancing tail to the next segment
      - Advancing head to the next segment
      
      For SPSC, the consumer still must wait for the producer to advance tail before it advances head.
      
      Reviewed By: djwatson
      
      Differential Revision: D8124279
      
      fbshipit-source-id: 4dc9b2c1f333a71e7283175e0f9c4ab2eaeb7549
      40a62d63
    • Lee Howes's avatar
      Make Future<T>::delayed complete on correct executor 2/n: Apply codemod future... · 1df0ebca
      Lee Howes authored
      Make Future<T>::delayed complete on correct executor 2/n: Apply codemod future delayed to delayed unsafe
      
      Summary:
      Overall plan to modify Future<T>::delayed to complete on the same
      executor as the input future.
      
      2/n: Codemod Future<T>::delayed to Future<T> delayedUnsafe. Name-only change, no behaviour.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8217994
      
      fbshipit-source-id: e20f861c2545f08a177b78e1dba643b267146e94
      1df0ebca
    • Sven Over's avatar
      add Executor::KeepAlive::copy() method · 439dc4ea
      Sven Over authored
      Summary: We do not want implicit copies of `KeepAlive`, because they may be accidental and they impose an overhead. However, making a copy by calling `folly::getKeepAliveToken(keep_alive.get())` does not look very nice. Also, in case that `keep_alive` is a dummy, it makes an unnecessary call to `Executor::keepAliveAcquire`, which will return false but cannot be inlined usually because it's a virtual function. This diff adds a `copy() const` method which returns a copy of the `KeepAlive` object. It only calls `Executor::keepAliveAcquire` if the original object is not a dummy.
      
      Reviewed By: yfeldblum, andriigrynenko
      
      Differential Revision: D8203839
      
      fbshipit-source-id: bb595d3836405bd84e55c4214ac19127b1e0e42a
      439dc4ea
    • Sven Over's avatar
      add unit test for Executor::KeepAlive · 9dd22f55
      Sven Over authored
      Summary:
      This diff adds a simple unit test, verifying that construction
      of a `KeepAlive` object (either from `Executor*` or move construction)
      calls `keepAliveAcquire` and `keepAliveRelease` the correct
      number of times.
      
      Reviewed By: elsteveogrande
      
      Differential Revision: D8203944
      
      fbshipit-source-id: 297beeaab99c55d7284ca06edd5e6b9023e27619
      9dd22f55
    • Andre Pinto's avatar
      Fix time-test linkage in oss build · fbecb252
      Andre Pinto authored
      Summary:
      Somehow gcc49 as used in travis-ci is having a hard time deciding which
      constructor to call in `folly/executors/test/ThreadPoolExecutorTest.cpp:721`.
      It can't decide between `folly/executors/CPUThreadPoolExecutor.h:69` and
      `folly/executors/CPUThreadPoolExecutor.h:83`.
      All this diff does is give it a hint about which constructor it should
      use.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8219425
      
      fbshipit-source-id: d92b08efc8bad795ce4a6775efd1e0512aaa6bb5
      fbecb252
    • Yedidya Feldblum's avatar
      Cut Futures private invocability helpers · 53484fd2
      Yedidya Feldblum authored
      Summary: [Folly] Cut Futures private invocability helpers, which can be replaced with invoke_result, is_invocable, etc.
      
      Reviewed By: marshallcline
      
      Differential Revision: D8087901
      
      fbshipit-source-id: 17282d77aaff61350d1e7f1b0c363c25db8fb5b1
      53484fd2
    • Yedidya Feldblum's avatar
      No longer allow continuations taking non-const lvalue-ref · e2fcfa38
      Yedidya Feldblum authored
      Summary: [Folly] No longer allow continuations taking non-const lvalue-ref, since that is not really necessary - callers can get all the same results using continuations taking non-const rvalue-ref instead.
      
      Reviewed By: Orvid
      
      Differential Revision: D8166011
      
      fbshipit-source-id: 468d049c6034339f3caf1a82fbc8c755ec2f51e6
      e2fcfa38
    • Lee Howes's avatar
      Make Future<T>::delayed complete on correct executor 1/n · 51a23742
      Lee Howes authored
      Summary:
      Overall plan to modify Future<T>::delayed to complete on the same
      executor as the input future.
      
      1/n: Adds Future<T>::delayedUnsafe that is identical to Future<T>::delayed
      but acts as a codemod target.
      
      Reviewed By: marshallcline
      
      Differential Revision: D8209451
      
      fbshipit-source-id: ee9c1184de2847e142516b315140fcc6d43948c5
      51a23742
    • Andre Pinto's avatar
      Build Hazptr.cpp · f0047766
      Andre Pinto authored
      Summary:
      `libfollylogging_example` is failing to link because it cannot find the
      definition of `folly::default_domain`.
      This diff adds Hazptr.cpp to the build script, which actually defines
      `folly::default_domain`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8217299
      
      fbshipit-source-id: 5fb36ef2f160cf45e93c2fc4098d58d384390e5d
      f0047766
  2. 30 May, 2018 10 commits
    • Maged Michael's avatar
      UnboundedQueue: Use synchronization/hazptr and hazptr_obj_base_linked · 49f1f482
      Maged Michael authored
      Summary:
      - Use the hazptr library under folly/synchronization.
        - Use hazptr_obj_base_linked to manage counted links.
      
      Reviewed By: djwatson
      
      Differential Revision: D7674822
      
      fbshipit-source-id: a87ece5dd1c7670677486af59988af8518abaf92
      49f1f482
    • Yedidya Feldblum's avatar
      CodeMod: future-then-continuation-lvalue-ref · 8d0571ca
      Yedidya Feldblum authored
      Summary:
      CodeMod: `future-then-continuation-lvalue-ref`.
      
      ```
      buck run mode/opt foundation/clangr:clangr_coordinator -- run foundation/clang/codemods:future-then-continuation-lvalue-ref --dev -p 7 --num-workers=200
      ```
      
      There is no need to support continuations taking non-const lvalue-ref params; callers can get exactly the same semantics with non-const rvalue-ref params instead. Thsi codemod preserves semantics. Many of these cases could do just as well taking by value, but this codemod preserves semantics.
      
      Reviewed By: Orvid
      
      Differential Revision: D8166008
      
      fbshipit-source-id: 84b635cccce24b6485ffb5b24b98f10422b9a517
      8d0571ca
    • Lee Howes's avatar
      Back out "[folly::Futures] Make Future::delayed complete on Future's executor." · df028149
      Lee Howes authored
      Summary: Original commit changeset: adcd387e237d
      
      Reviewed By: mzlee
      
      Differential Revision: D8204982
      
      fbshipit-source-id: 2c66f58ccf41dc70f55b3ecffc6e197c23c4f959
      df028149
    • Maged Michael's avatar
      hazptr: Fix typos · 1e08cbbe
      Maged Michael authored
      Summary: Fix typos
      
      Reviewed By: Tingzhe
      
      Differential Revision: D8160938
      
      fbshipit-source-id: f4eaf496a33b7d2b6266a8424850640028660331
      1e08cbbe
    • Dave Watson's avatar
      Make addObserver/removeObserver take a write lock · 963b9f82
      Dave Watson authored
      Summary:
      As title.  These methods look like they never protected observers_ list, and relied on
      the user not calling addObserver or removeObserver concurrently.  I don't see any downsides
      to taking a write lock here, these methods aren't called often.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D8187184
      
      fbshipit-source-id: dd20b809e851cc14a05aca3bc9722e0a9236665f
      963b9f82
    • Dave Watson's avatar
      Remove hazptr_cleanup from ConcurrentHashMap · 6d02e2b5
      Dave Watson authored
      Summary: Causing perf issues.  Users must add explicitly to tests or other use cases.
      
      Differential Revision: D8162835
      
      fbshipit-source-id: 7095064209ced870768552307675dc1ebbf68bdc
      6d02e2b5
    • Dave Watson's avatar
      Add thread timeout memory barrier · e132960c
      Dave Watson authored
      Summary:
      Add correct memory barrier to thread timeout / add path.
      
      This seems like the fastest way to maintain safety here.  We could use
      a read-biased rw lock instead, but that would mean taking a heavy memory
      barrier in add() if we do have to add a thread.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D8161950
      
      fbshipit-source-id: af2bd3a601ced9bb04a8206696e7a998c75f6369
      e132960c
    • Lee Howes's avatar
      Make Future::delayed complete on Future's executor. · f22f6d96
      Lee Howes authored
      Summary: Future::delayed could complete on Future::sleep's executor. Ensure instead that it completes on the future's executor.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8052038
      
      fbshipit-source-id: adcd387e237dbd724d5f9deb5c80d1418987482d
      f22f6d96
    • Lee Howes's avatar
      Make onTimeout use thenError which maintains executor. · a0b0d9b5
      Lee Howes authored
      Summary: Make onTimeout call thenError which maintains the executor rather than onError which does not.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8051906
      
      fbshipit-source-id: 41ca5f657a441ff8eaacdfab6d4cfb45d5e5f0c2
      a0b0d9b5
    • Andrii Grynenko's avatar
      Add via() overloads that accept Executor::KeepAlive · 69f86ccc
      Andrii Grynenko authored
      Summary: This enables using Executor adaptors (e.g. SerialExecutor) with futures.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8198893
      
      fbshipit-source-id: 48c59b618bd2bbad4277b7f0b0f0b19347266813
      69f86ccc
  3. 29 May, 2018 6 commits
    • Lee Howes's avatar
      Added cutdown Futures.md into docs tree and removed futures/README.md. · 3ce2b217
      Lee Howes authored
      Summary:
      Futures documentation was drifting out of date. The documentation index also had broken links to Futures and a core readme.
      
      This change adds basic futures documentation in the docs tree and removed the README.md in the futures tree.
      
      Reviewed By: marshallcline
      
      Differential Revision: D7937360
      
      fbshipit-source-id: 120610cca21db5a8b38199a5098551f10bb85251
      3ce2b217
    • Lee Howes's avatar
      Consistency with folly::SemiFuture continuations 5/n: make deferError use the... · 0b2ff089
      Lee Howes authored
      Consistency with folly::SemiFuture continuations 5/n: make deferError use the same exception unpacking machinery as thenError
      
      Summary:
      Step 5 in adding full set of r-value-qualified unambiguous continuation methods to folly::Future for consistency with folly::SemiFuture.
       * Back point explicit exceptions election to deferError.
      
      Reviewed By: marshallcline
      
      Differential Revision: D8124828
      
      fbshipit-source-id: 123b1cf460d2df4c8f359eff7329d34fbd8e0a9b
      0b2ff089
    • Dave Watson's avatar
      Add cleanup benchmark · e82284a8
      Dave Watson authored
      Summary: Add cleanup benchmark
      
      Reviewed By: magedm
      
      Differential Revision: D8162617
      
      fbshipit-source-id: 5ef729913db889f999c8bb051c4291e748854000
      e82284a8
    • Maged Michael's avatar
      UnboundedQueue: Add support for single consumer try_peek operation. · 05fc2561
      Maged Michael authored
      Summary: Add a try_peek() member function valid only if SingleConsumer==true that returns folly::Optional<const T*> which (if has_value() is true) contains a pointer to the first element in the queue.
      
      Reviewed By: djwatson
      
      Differential Revision: D7969290
      
      fbshipit-source-id: 3e15138f6c6523adce4da4cd99b74e0a83cd24d7
      05fc2561
    • Dave Watson's avatar
      Use Barrier in benchmark · 1d005b45
      Dave Watson authored
      Summary:
      Use folly::test::Barrier in benchmark instead of spin-waiting.  Benchmarks are more consistent now,
      and perf output is useful instead of showing a bunch of spinning.
      
      Also remove the DSched stuff from bench(), we don't want to benchmark DSched.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D8162600
      
      fbshipit-source-id: 52a1218e7fc2b87f0926dbc29c13bf0c9478e804
      1d005b45
    • Dave Watson's avatar
      Split Barrier to separate file · 97027cbe
      Dave Watson authored
      Summary: Split barrier to separate file so it can be used in other tests.
      
      Reviewed By: magedm
      
      Differential Revision: D8162586
      
      fbshipit-source-id: c3a239fe6fdb3f895557e7b93a5a960b9e871f0c
      97027cbe
  4. 28 May, 2018 9 commits
    • Yedidya Feldblum's avatar
      Avoid errnoeous deprecation warning in F14BasicSet · e9715ac6
      Yedidya Feldblum authored
      Summary:
      [Folly] Avoid errnoeous deprecation warning in `F14BasicSet`.
      
      The deprecation warning is emitted for instantiations like `F14FastSet<std::string>`.
      
      The warning is triggered by looking for move-constructibility of the mapped type for maps or `void` for sets, but `void` is not move-constructible. There are a variety of techniques to solve this, and the smallest change is to use `lift_unit_t` in the right place. `Unit` is move-constructible where `void` is not.
      
      Reviewed By: nbronson
      
      Differential Revision: D8178045
      
      fbshipit-source-id: 1ca06e84b4ed7acd415901afcbe80663513063ea
      e9715ac6
    • Yedidya Feldblum's avatar
      Cut extra template instantiations from Unit traits · 6e612d3d
      Yedidya Feldblum authored
      Summary: [Folly] Cut extra template instantiations from `Unit` traits - namely, `std::conditional` and `std::is_same`. The behavior can be done directly, while each extra template instantiations imposes some small compile-time cost.
      
      Reviewed By: Orvid
      
      Differential Revision: D8178033
      
      fbshipit-source-id: 22ba5ae810e2bca616e7db332c1f635e2520f3a7
      6e612d3d
    • Lee Howes's avatar
      Consistency with folly::SemiFuture continuations 4/n: thenError · 95016602
      Lee Howes authored
      Summary:
      Step 4 in adding full set of r-value-qualified unambiguous continuation methods to folly::Future for consistency with folly::SemiFuture.
       * Adds r-value qualified thenError that just call onError internally but in a more type safe obvious way.
       * Makes exception selection explicit to avoid exception_wrapper exception-type ambiguity in continuations.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D7971326
      
      fbshipit-source-id: 8aa94161abb629d94ee8da6fb0a4bca991cf24e4
      95016602
    • Lee Howes's avatar
      Consistency with folly::SemiFuture continuations 3/n: correct define scoping · c7fd4b4b
      Lee Howes authored
      Summary:
      Step 3 in adding full set of r-value-qualified unambiguous continuation methods to folly::Future for consistency with folly::SemiFuture.
       * Undefs function-scoped defines to avoid leaking.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D7997136
      
      fbshipit-source-id: 4eb188bc55134da8349e984e9eb85466d7b0042c
      c7fd4b4b
    • Orvid King's avatar
      Fix MSVC build · 4e61ea02
      Orvid King authored
      Summary: MSVC was failing to resolve `AllocTraits` within this specific context.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8179354
      
      fbshipit-source-id: 236094f704bc89ec81236e9a67054e2081590cf6
      4e61ea02
    • Orvid King's avatar
      Folly is a C++14 library · a51a28c0
      Orvid King authored
      Summary:
      There are quite a few things in Folly that are not compatible with C++11.
      
      Closes: https://github.com/facebook/folly/issues/851
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8179239
      
      fbshipit-source-id: b4ce23b98311a7c5ac15c3b7c9787f568535c950
      a51a28c0
    • Lee Howes's avatar
      Consistency with folly::SemiFuture continuations 2/n: thenTry · 242ddb11
      Lee Howes authored
      Summary:
      Step 2 in adding full set of r-value-qualified unambiguous continuation methods to folly::Future for consistency with folly::SemiFuture.
       * Adds r-value qualified thenTry which directly forwards to then, but has compile-time restrictions on the continuations that can be passed to avoid ambiguity.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D7944820
      
      fbshipit-source-id: 55ee09455703bb73168694175e884b053caff426
      242ddb11
    • Lee Howes's avatar
      Invoke SemiFuture defer-continuations with same cvref as passed · f7e99444
      Lee Howes authored
      Summary:
      [Folly] Invoke SemiFutures defer-continuations with the same cvref as passed.
      for example, if passed as const&&, invoke as const&&, and if passed as volatile&, invoke as volatile&.
      This brings a little more consistency to the library.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8125144
      
      fbshipit-source-id: f2cda643aaae40e0293d5d79608541771642ce06
      f7e99444
    • Lee Howes's avatar
      Consistency with folly::SemiFuture continuations 1/n: Add Future<T>::thenValue. · 2c23497f
      Lee Howes authored
      Summary:
      Step 1 in adding full set of r-value-qualified unambiguous continuation methods to folly::Future for consistency with folly::SemiFuture.
      
       * Add r-value qualified Future<T>::thenValue.
       * Make callableResult structs consistently named so they work for Future and SemiFuture.
       * Correct call behaviour for consistency with invokeCallbackReturningFutureAsRvalue test.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D7944603
      
      fbshipit-source-id: 081383a91749310472a8106289671cffa6139691
      2c23497f
  5. 27 May, 2018 1 commit
    • Orvid King's avatar
      Support debug/release distinction in FindZstd · 48eee7b8
      Orvid King authored
      Summary: This gets Folly working with the zstd package provided by vcpkg.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8176531
      
      fbshipit-source-id: 05fdd5915a677a862791cfcc5587f7a396fb4c51
      48eee7b8
  6. 26 May, 2018 4 commits
    • Orvid King's avatar
      Change calls from collectAll to collectAllSemiFuture · f2bdc48d
      Orvid King authored
      Summary: We are changing `folly::collectAll` to return `SemiFuture` rather than `Future` and this is needed as an interim step. After all calls to `collectAll` are changed to `collectAllSemiFuture`, we'll be renaming it back to `collectAll`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8157548
      
      fbshipit-source-id: 27b768ac7ff0d6572bde57f01601045a1fd5d5e5
      f2bdc48d
    • Marshall Cline's avatar
      test cases per discussion in D7923362 · fad32186
      Marshall Cline authored
      Summary:
      Discussion in D7923362 included validity & behavior of `wait()` vs. fulfillment and `wait()` vs. `then()`.
      
      18 test-cases:
      
      8 cases with `.wait(...)` and fulfillment:
      
      - Future vs. SemiFuture
      - wait() vs. wait(dur)
      - fulfilled before wait(...) call vs. during wait(...) call
      
      10 cases with `.wait(...)` and `.then(...)`:
      
      - 4 wait() cases: {Future vs. SemiFuture} that gets fulfilled {prior to, during} the wait() call.
      - 6 wait(dur) cases: {Future vs. SemiFuture} that gets fulfilled {prior to, during, after} the wait(dur) call.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8048426
      
      fbshipit-source-id: c79cc337706f08f8fb9c6057a114723320a90820
      fad32186
    • Nathan Bronson's avatar
      more tests for F14 - stateful functors · c3ffff44
      Nathan Bronson authored
      Summary:
      This diff adds recurring tests of F14's ability to use stateful
      functors with no default constructor.
      
      This is a test-only diff.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8170593
      
      fbshipit-source-id: 6ce8c7751ce32ed69b60c6884b5deb7e6378a5d1
      c3ffff44
    • rdhabalia's avatar
      Allow HHWheelTimer to set default-timeout · 299a38f8
      rdhabalia authored
      Summary:
      We are using facebook::proxygen to build Http-utility on top of it. One of the main server-connector class `Proxygen::HTTPConnector` requires `folly::HHWheelTimer` to perform timer stuff inside it.
      
      Now, `folly::HHWheelTimer` is a very large object and we would like to avoid `folly::HHWheelTimer` creation for every new `Proxygen::HTTPConnector` therefore, we are thinking to reuse `EventBase::timer()` that creates one timer per EventBase (application creates it 1 per io thread).
      
      But `EventBase::timer()` creates timer with default-time and caller can not modify it. Because of that other dependent component can't use it and proxygen gives below error:
      ```
      F0522 23:50:19.629158  7775 WheelTimerInstance.cpp:71] Check failed: defaultTimeoutMS_.count() >= 0 (-1 vs. 0)
      *** Check failure stack trace: ***
          @     0x7f5e6ce26e6d  (unknown)
          @     0x7f5e6ce28ced  (unknown)
          @     0x7f5e6ce26a5c  (unknown)
          @     0x7f5e6ce2963e  (unknown)
          @     0x7f5e6de8c1ad  proxygen::WheelTimerInstance::scheduleTimeout()
          @     0x7f5e6de7c059  proxygen::HTTPTransaction::HTTPTransaction()
          @     0x7f5e6deacff1  ...
          @     0x7f5e6deaa23a  proxygen::HTTPSession::createTransaction()
          @           0x4f7f93  proxygen::HTTPUpstreamSession::newTransaction()
          @           0x4ad9a4  Sherpa::HttpSession::sendRequest()
          @           0x4aee08  Sherpa::HttpSession::connectSuccess()
          @           0x4f5c69  proxygen::HTTPConnector::connectSuccess()
          @     0x7f5e6d47e414  folly::AsyncSocket::handleConnect()
          @     0x7f5e6d48769d  folly::AsyncSocket::handleWrite()
          @     0x7f5e6d47a05c  folly::AsyncSocket::ioReady()
      ```
      
      - add `setDefaultTimeout()` method into timer so, application can configure it.
      
      - No functional change but it facilitates application to configure defaultTimeout after `folly::HHWheelTimer` is created.
      Closes https://github.com/facebook/folly/pull/850
      
      Reviewed By: djwatson
      
      Differential Revision: D8123617
      
      Pulled By: yfeldblum
      
      fbshipit-source-id: 4dd9b19506bea380239200b6207ac05a40a0686c
      299a38f8
  7. 25 May, 2018 1 commit
    • Nathan Bronson's avatar
      support for unequal allocators · 4835f0e5
      Nathan Bronson authored
      Summary:
      The move constructor and move assignment operator for
      allocator-aware containers is supposed to allocate new memory and
      move values across when the underlying allocators are not equal.
      Previously F14 just checked that this wasn't the case.  This diff
      implements this feature.  This allows F14 tables to be moved into and
      out of allocator-managed memory segments, such as arenas or shared
      memory extents.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8022286
      
      fbshipit-source-id: ff0b220450bb76822cc68cebad079a7ef43e2429
      4835f0e5