1. 27 Sep, 2017 1 commit
  2. 26 Sep, 2017 1 commit
    • Michael Lee's avatar
      Delete conversion from Objective-C block to folly::Function · b6845258
      Michael Lee authored
      Summary: Objective-C blocks are stack allocated, and unless there is a proper assignment it isn't retained and the memory is freed. Because folly::Function used to move, it would hold a reference, but after switch to a constructor by-value, it no longer does this and we see a use-after-free.
      
      Reviewed By: yfeldblum, ericniebler
      
      Differential Revision: D5888606
      
      fbshipit-source-id: fe4cabb2f2ae289cce0e7429e0af3935ba314720
      b6845258
  3. 24 Sep, 2017 1 commit
    • Yedidya Feldblum's avatar
      Let ProcessReturnCode be publicly constructible · 4af3040b
      Yedidya Feldblum authored
      Summary:
      [Folly] Let `ProcessReturnCode` be publicly constructible.
      
      Via provided constructor functions, which limit how it may be constructed so that it is only constructible into a valid state.
      
      Differential Revision: D5898739
      
      fbshipit-source-id: 7490018adfc39408b4290248ef1220e8fd0238cb
      4af3040b
  4. 23 Sep, 2017 2 commits
    • Yedidya Feldblum's avatar
      Avoid tautological compare in folly/experimental/symbolizer/ · 91da2e5a
      Yedidya Feldblum authored
      Summary:
      [Folly] Avoid tautological compare in `folly/experimental/symbolizer/`.
      
      `x < 0` when `x` is unsigned is tautological and there are warnings against such comparisons. The underlying type of an unscoped enumerations without a fixed underlying type is not specified, and whether it is signed is also not specified; it could be unsigned, and is unsigned in practice in common cases.
      
      Reviewed By: Orvid, eduardo-elizondo
      
      Differential Revision: D5897792
      
      fbshipit-source-id: 24d84f9bf2c61c907585e1b675c2bbf11ef1720b
      91da2e5a
    • Matthew Tolton's avatar
      Fix deadlock in TimedMutex · 47d37c8e
      Matthew Tolton authored
      Summary:
      If a lock is stolen from fiber f1, and then fiber f2 is notified before f1 one
      wakes up and discovers the crime, then f1 will clear notifiedFiber_ so that f2
      thinks the lock was stolen from it as well and hence recurses back into lock().
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D5896323
      
      fbshipit-source-id: 528ec1ed983175d3e08f3dc07b69bbc783a86cfb
      47d37c8e
  5. 22 Sep, 2017 1 commit
    • Nathan Bronson's avatar
      fix ASAN stl_tests:stl_vector_test · aee7113e
      Nathan Bronson authored
      Summary:
      folly/test/stl_tests/StlVectorTest.cpp was too slow under
      mode/dev-asan, resulting in timeouts, and the relinquish test allocated
      with malloc and freed with operator delete.  This diff reduces the vector
      size for testing under ASAN, and fixes the allocation mismatch.
      
      Reviewed By: Orvid
      
      Differential Revision: D5890969
      
      fbshipit-source-id: 49a9498f6c0c4b3c7165906efd1262e518fea810
      aee7113e
  6. 21 Sep, 2017 1 commit
  7. 20 Sep, 2017 1 commit
    • Kenny Yu's avatar
      Add gdb deadlock detector script to new folly/experimental/gdb directory · 14e3d271
      Kenny Yu authored
      Summary:
      This adds a gdb deadlock detector script into a new directory in folly. I
      chose to put it under the `experimental` directory and not the top-level
      directory as we have only tested these scripts on x86_64 Linux and not other
      types of platforms.
      
      This diff includes:
      - a README on the contents of this directory and how to use the scripts
      - a script to detect deadlocks
      
      gdb directory
      ---------------
      
      This new directory will contain a collection of gdb scripts that we have
      found helpful. These scripts use the [gdb extension Python API](https://sourceware.org/gdb/current/onlinedocs/gdb/Python.html#Python).
      
      To run the scripts, fire up gdb and load a script with `source -v`. Example:
      
      ```
      $ gdb -p 123456
      (gdb) source -v ./folly/experimental/gdb/deadlock.py
      Type "deadlock" to detect deadlocks.
      (gdb) deadlock
      Found deadlock!
      ...
      ```
      
      deadlock detector script
      ----------------------------
      
      Consider the following program that always deadlocks:
      
      ```
      void deadlock3() {
        std::mutex m1, m2, m3;
        folly::Baton<> b1, b2, b3;
      
        auto t1 = std::thread([&m1, &m2, &b1, &b2] {
          std::lock_guard<std::mutex> g1(m1);
          b1.post();
          b2.wait();
          std::lock_guard<std::mutex> g2(m2);
        });
      
        auto t2 = std::thread([&m3, &m2, &b3, &b2] {
          std::lock_guard<std::mutex> g2(m2);
          b2.post();
          b3.wait();
          std::lock_guard<std::mutex> g3(m3);
        });
      
        auto t3 = std::thread([&m3, &m1, &b3, &b1] {
          std::lock_guard<std::mutex> g3(m3);
          b3.post();
          b1.wait();
          std::lock_guard<std::mutex> g1(m1);
        });
      
        t1.join();
        t2.join();
        t3.join();
      }
      ```
      
      Once the process has deadlocked, we can use gdb to find the threads and mutexes involved in the deadlock:
      
      ```
      $ gdb -p 2174496
      (gdb) source -v ./folly/experimental/gdb/deadlock.py
      Type "deadlock" to detect deadlocks.
      (gdb) deadlock
      Found deadlock!
      Thread 2 (LWP 2174497) is waiting on mutex (0x00007ffcff42a4c0) held by Thread 3 (LWP 2174498)
      Thread 3 (LWP 2174498) is waiting on mutex (0x00007ffcff42a4f0) held by Thread 4 (LWP 2174499)
      Thread 4 (LWP 2174499) is waiting on mutex (0x00007ffcff42a490) held by Thread 2 (LWP 2174497)
      ```
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5860868
      
      fbshipit-source-id: 020a32327a79bb066269fe08113695803ce06c7d
      14e3d271
  8. 19 Sep, 2017 4 commits
    • Phil Willoughby's avatar
      Benchmark a realistic common use · 3619b401
      Phil Willoughby authored
      Summary:
      We didn't previously benchmark the performance of `get()`, which was a strange
      omission.
      
      Reviewed By: akrieger
      
      Differential Revision: D5863567
      
      fbshipit-source-id: 468b249da9120fcb84f3303ac5e2157761b6369d
      3619b401
    • Christopher Dykes's avatar
      Enable -Wunused-variables · 94b8816b
      Christopher Dykes authored
      Summary:
      Only for clang for the moment, as more work is needed for GCC.
      MSVC builds have always had unused variable warnings enabled, I just hadn't gotten around to cleaning up all of the tests for it to be able to enable it.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5827840
      
      fbshipit-source-id: ab503b5791fcc58d685b8327179b810880c5dea7
      94b8816b
    • Christopher Dykes's avatar
      Fix hardware crc32 under MSVC · f3bce424
      Christopher Dykes authored
      Summary: It was horribly broken in multiple ways. It didn't support input > 4gb on Windows, was truncating the entire table to chars, and simply couldn't be compiled because it was exceeding MSVC's max macro instantion depth of 255.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5827332
      
      fbshipit-source-id: b08268c88db10c607b27231689b3ee3ec7553c1f
      f3bce424
    • Christopher Dykes's avatar
      Set names in NamedThreadFactory in the new thread · aa62e6f3
      Christopher Dykes authored
      Summary: This makes it now both work, and compile, on Windows.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5811100
      
      fbshipit-source-id: 5d6bfc04ed8e60417615da15bd197769e0c79c11
      aa62e6f3
  9. 18 Sep, 2017 1 commit
    • Eric Niebler's avatar
      fix strange recursive std::is_constructible instantiation involving the... · d3e97eba
      Eric Niebler authored
      fix strange recursive std::is_constructible instantiation involving the Function converting constructor
      
      Summary: In rare and obscure cases, the fact that `folly::Function`'s perfectly-forwarding, implicit converting constructor was SFINAE-ing on the argument's constructibility was causing a recursive template instantiation of std::is_constructible. Switch to passing the argument by value to avoid the need to test for constructibility.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5847034
      
      fbshipit-source-id: ce2ad1d2490206c6cae84c17544bd9fcd6ff47bb
      d3e97eba
  10. 15 Sep, 2017 4 commits
    • Eric Niebler's avatar
      Fix coroutine feature test macro on MSVC · 27197728
      Eric Niebler authored
      Summary: Coroutines are only available on MSVC when the /await compiler switch was passed, in which case the `_RESUMABLE_FUNCTIONS_SUPPORTED` macro is defined.
      
      Reviewed By: Orvid
      
      Differential Revision: D5837303
      
      fbshipit-source-id: af3349646e8875e3eac1bc3bbf47203f41f0bbde
      27197728
    • Dylan Yudaken's avatar
      Allow awaiting on a folly::Optional that returns a move-only type · 3597c587
      Dylan Yudaken authored
      Summary:
      await_resume is only called once, so this allows it to move the value out.
      At the same time remove a redundant clear (but keep the existing requirement that the promise type is an OptionalPromise), and clean up the tests.
      Also add a test to make sure the coroutine is cleaned up
      
      Reviewed By: ericniebler
      
      Differential Revision: D5834861
      
      fbshipit-source-id: 7ad487e818969cdf6fe27c9e82931aa247daf4e4
      3597c587
    • Stella Lau's avatar
      Allow getAutoUncompressionCodec() to have 1 terminal decoder · 481365ef
      Stella Lau authored
      Summary: getAutoUncompressionCodec() currently only allows unambiguous headers. Allow a single "terminal codec" to be called if all other codecs can't uncompress or throw.
      
      Reviewed By: terrelln
      
      Differential Revision: D5804833
      
      fbshipit-source-id: 057cb6e13a48fea20508d5c028234afddf7435f6
      481365ef
    • Pádraig Brady's avatar
      fix usingJEMalloc() with LTO · 610c1163
      Pádraig Brady authored
      Summary:
      LTO has better optimization which results in the malloc() being optimized away in this function.
      
      Note we don't use folly::dontOptimizeAway() because
      that introduces a circular dependency between the
      malloc and benchmark targets.
      
      Reviewed By: marksantaniello, meyering, interwq
      
      Differential Revision: D5840883
      
      fbshipit-source-id: 5dd9b152f70b7a49f125b6d79b4dfa40f4cdac59
      610c1163
  11. 14 Sep, 2017 3 commits
  12. 13 Sep, 2017 4 commits
    • Christopher Dykes's avatar
      Fix build without zlib compression enabled · fb0a1228
      Christopher Dykes authored
      Summary: The namespace alias was trying to alias a namespace that doesn't exist unless Folly is being compiled with zlib support.
      
      Reviewed By: terrelln
      
      Differential Revision: D5810929
      
      fbshipit-source-id: c659d8f775fc9b99e57cc95f5914418507e546fb
      fb0a1228
    • Stephen Chen's avatar
      fixing namespacing issue for the dummy non sse crc32c_hw · aa062435
      Stephen Chen authored
      Summary:
      Because the way the #if was written, the dummy crc32c_hw function accidentally
      ended in folly namespace instead of folly::details as expected. Fix this.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5826187
      
      fbshipit-source-id: ba0f2207a00bc21eda7a727f3f1025e1106d55f9
      aa062435
    • Marcus Holland-Moritz's avatar
      Fix UB from signed integer overflow in RWSpinLock · 7a3f4d06
      Marcus Holland-Moritz authored
      Summary:
      The signed counters used in a couple of places can in theory (and practice)
      overflow, yielding UB. Use unsigned counters instead.
      
      Reviewed By: luciang, philippv
      
      Differential Revision: D5818606
      
      fbshipit-source-id: c5928b779e76b309b00b7f6308a220e2bf6cbf79
      7a3f4d06
    • Jon Maltiel Swenson's avatar
      Backed out changeset ea9041ce2280 · 1c6da6e3
      Jon Maltiel Swenson authored
      Summary: Revert D5787837. Breaks `onSet()`/`onUnset()` behavior.
      
      Reviewed By: palmtenor
      
      Differential Revision: D5817063
      
      fbshipit-source-id: c7dea636fa60eb616d4ebe0a9d418bc96b3018ae
      1c6da6e3
  13. 12 Sep, 2017 8 commits
    • Michael Lee's avatar
      Include glog/logging.h in SmallLocksTest for DCHECK · d5005766
      Michael Lee authored
      Summary: The test uses DCHECK, but does not include glog/logging.h.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5818647
      
      fbshipit-source-id: fcb2630ac2b12acd1a7b84e228349b2887e976cd
      d5005766
    • Alberto Schiabel's avatar
      Update String.h · 17fd438a
      Alberto Schiabel authored
      Summary:
      Fixed typo in doc comment related to `void toLowerAscii(char* str, size_t length)`.
      This fixes the annoying xCode's warning `Parameter 'len' not found in the function declaration`.
      Closes https://github.com/facebook/folly/pull/670
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5815034
      
      Pulled By: Orvid
      
      fbshipit-source-id: 9580cd0bbd4924d4ed461a5435f525316e5c285a
      17fd438a
    • Christopher Dykes's avatar
      Don't use std::void_t · d4bba1e7
      Christopher Dykes authored
      Summary: I was wrong, MSVC's implementation has the same bug as everything else.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5810646
      
      fbshipit-source-id: 9caabbbc2115f57b7e836bb85c9b108588c94ad9
      d4bba1e7
    • Martin Martin's avatar
      const -> constexpr in folly::small_vector · d3555e67
      Martin Martin authored
      Summary: const -> constexpr in folly::small_vector
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5814264
      
      fbshipit-source-id: 4631bb7f3f04906636e5a188d4aa0d33ad796a3c
      d3555e67
    • Philip Jameson's avatar
      Remove unneeded parts of build script · 053c0a86
      Philip Jameson authored
      Summary: Remove an unneeded autoconf flag, as it causes the build to fail on missing boost-context
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5815646
      
      fbshipit-source-id: cb6544593de9fbf8248506b09c56412b4635b30c
      053c0a86
    • Martin Martin's avatar
      clang-format folly::small_vector. No functional change. · 6f7b20b8
      Martin Martin authored
      Summary: clang-format folly::small_vector.  No functional change.
      
      Reviewed By: Orvid
      
      Differential Revision: D5808357
      
      fbshipit-source-id: d2ee831e25c60778c699214b875635c22854832d
      6f7b20b8
    • Jon Maltiel Swenson's avatar
      Make RequestContext provider overridable in order to save cost of setContext()... · 943afd98
      Jon Maltiel Swenson authored
      Make RequestContext provider overridable in order to save cost of setContext() on each fiber context switch
      
      Summary:
      Each fiber context switch currently involves the cost of saving/restoring `RequestContext`.  Certain
      fibers-based applications such as mcrouter don't use `RequestContext` at all, so updating the current
      thread-global `RequestContext` on each fiber context switch is unnecessary overhead.  Avoid this cost
      by allowing `FiberManager` to override the `RequestContext` provider at the start and end of each fiber drain
      loop.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D5787837
      
      fbshipit-source-id: ea9041ce228063c8701165366fd1e34132868d22
      943afd98
    • Christopher Dykes's avatar
      Fix CMake build · 14b06383
      Christopher Dykes authored
      Summary: Spookyhash got moved a long time ago, and a duplicate test name was added with the migration of executors from wangle to folly.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5811321
      
      fbshipit-source-id: 789b4d3187a2e1e21c6cf8297f733bb4dffdbd60
      14b06383
  14. 11 Sep, 2017 2 commits
    • Phil Willoughby's avatar
      Dead shift in ConcurrentHashMapSegment · d25d17e7
      Phil Willoughby authored
      Summary: Original problem detected by compiling with `-Werror,-Wunused-value`. On further inspection the only place which uses this detail class ensures that the `max_size` parameter is a power of two already, so we can discard the logic to manipulate `max_size` and put a `CHECK` clause in its place to guard against future changes to the caller that break this assumption.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5799110
      
      fbshipit-source-id: d21ed9ff196d54ef91e38254df8b1b88bbf29275
      d25d17e7
    • Anirudh Ramachandran's avatar
      Move SSL_CTX sessionContext initialization into main SSL_CTX initialization path · 001275d1
      Anirudh Ramachandran authored
      Summary: This field was only previously set if setupSessionCache was called on the wangle::ServerSSLContext
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5776057
      
      fbshipit-source-id: ecdbe83816fee2ecbe7ea1b26a67b682a571309a
      001275d1
  15. 10 Sep, 2017 2 commits
    • Giuseppe Ottaviano's avatar
      Add convenience std::string overload for toLowerAscii · d84e6482
      Giuseppe Ottaviano authored
      Summary:
      `toLowerAscii` is surprisingly hard to use with `std::string` because (until C++17) `data()` returns a `const char*`. In addition, it is not widely known that `s[0]` is legal even if the string is empty. This can lead to a variety of suboptimal code, from explicitly checking emptiness, to casting away the `const` (which causes UB).
      
      Let's just have a simple overload for it.
      
      Reviewed By: pixelb, philippv, yfeldblum
      
      Differential Revision: D5801970
      
      fbshipit-source-id: 407e2e9e66147a0662a5e09c75921255adff0702
      d84e6482
    • Giuseppe Ottaviano's avatar
      Fix typo in async/README.md · cb471a45
      Giuseppe Ottaviano authored
      Reviewed By: yfeldblum
      
      Differential Revision: D5802013
      
      fbshipit-source-id: 472b09da2be7234157a7886018004e2f4ed4f279
      cb471a45
  16. 08 Sep, 2017 3 commits
    • Benjamin Jaeger's avatar
      Optional.h - make == operators constexprs · 4b351b61
      Benjamin Jaeger authored
      Summary: This more closely matches std optional and allows folly Optional to be a drop in replacement.
      
      Reviewed By: aary, yfeldblum
      
      Differential Revision: D5775541
      
      fbshipit-source-id: f754c006429fa3c5a866b6b5ffdfd8883ec2dd4f
      4b351b61
    • Eric Niebler's avatar
      support using co_await with folly::Optional when it is available · d6217b2f
      Eric Niebler authored
      Summary:
      Coroutines can be used to simulate the monadic "do" notion of Haskell. Use coroutines to enable monadic composition with folly::Optional.
      
      ```
      Optional<int> f() {
        return 7;
      }
      Optional<int> g(int) {
        return folly::none;
      }
      
      void MonadicOptional() {
        Optional<int> r = []() -> Optional<int> {
          int x = co_await f();
          assert(x == 7);
          int y = co_await g(x);
          assert(false); // not executed
          co_return y;
        }();
        assert(!r.hasValue());
      }
      ```
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5763371
      
      fbshipit-source-id: 9babc682244f38da7006d0b3a8444fd4efec1747
      d6217b2f
    • Michael Bolin's avatar
      Grammar fix: s/it's/its/ · e74c15ff
      Michael Bolin authored
      Summary:
      I noticed this while reading the docs.
      
      (Note: this ignores all push blocking failures!)
      
      Reviewed By: lbrandy
      
      Differential Revision: D5795548
      
      fbshipit-source-id: 9ec5aa13a8913f217b3118e72714d02dc4a9407f
      e74c15ff
  17. 07 Sep, 2017 1 commit
    • Kenny Yu's avatar
      Fix data race in folly/executors/Codel.cpp exposed by TSAN · 88903796
      Kenny Yu authored
      Summary:
      I found a data race with TSAN while attempting to run a sanitizer version of my service:
      
      ```
      WARNING: ThreadSanitizer: data race (pid=266)
        Read of size 8 at 0x7b58000c0c08 by thread T370:
          @ folly::Codel::overloaded(std::chrono::duration<long, std::ratio<1l, 1000000000l> >) at ./folly/executors/Codel.cpp:44
          @ apache::thrift::concurrency::ThreadManager::ImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::Worker<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::run() at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:119
          @ apache::thrift::concurrency::PthreadThread::threadMain(void*) at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:200
          @ __tsan_thread_start_func at crtstuff.c:?
      
        Previous write of size 8 at 0x7b58000c0c08 by thread T371:
          @ folly::Codel::overloaded(std::chrono::duration<long, std::ratio<1l, 1000000000l> >) at ./folly/executors/Codel.cpp:62
          @ apache::thrift::concurrency::ThreadManager::ImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::Worker<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::run() at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:119
          @ apache::thrift::concurrency::PthreadThread::threadMain(void*) at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:200
          @ __tsan_thread_start_func at crtstuff.c:?
      
        Location is heap block of size 744 at 0x7b58000c0c00 allocated by thread T314:
          @ operator new(unsigned long) at ??:?
          @ PriorityImplT at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:826
          @ void __gnu_cxx::new_allocator<apache::thrift::concurrency::PriorityThreadManager::PriorityImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > > >::construct<apache::thrift::concurrency::PriorityThreadManager::PriorityImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >, std::array<std::pair<std::shared_ptr<apache::thrift::concurrency::ThreadFactory>, unsigned long>, 5ul>&, bool&, unsigned long&>(apache::thrift::concurrency::PriorityThreadManager::PriorityImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >*, std::array<std::pair<std::shared_ptr<apache::thrift::concurrency::ThreadFactory>, unsigned long>, 5ul>&, bool&, unsigned long&)
          @ std::shared_ptr<apache::thrift::concurrency::PriorityThreadManager> apache::thrift::concurrency::PriorityThreadManager::newPriorityThreadManager<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >(std::array<unsigned long, 5ul> const&, bool, unsigned long) at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:1090
          @ std::shared_ptr<apache::thrift::concurrency::PriorityThreadManager> apache::thrift::concurrency::PriorityThreadManager::newPriorityThreadManager<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >(unsigned long, bool, unsigned long) at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:1100
          @ apache::thrift::ThriftServer::serve() at ./thrift/lib/cpp2/server/ThriftServer.cpp:475
          @ apache::thrift::server::TServer::run() at ./thrift/lib/cpp/server/TServer.h:186
          @ apache::thrift::concurrency::PthreadThread::threadMain(void*) at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:200
          @ __tsan_thread_start_func at crtstuff.c:?
      
        Thread T370 (tid=638, running) created by thread T314 at:
          @ pthread_create at ??:?
          @ apache::thrift::concurrency::PthreadThread::start() at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:108
          @ apache::thrift::concurrency::ThreadManager::ImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::addWorker(unsigned long) at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:185
          @ apache::thrift::concurrency::PriorityThreadManager::PriorityImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::start() at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:840
          @ apache::thrift::ThriftServer::setup() at ./thrift/lib/cpp2/server/ThriftServer.cpp:347
          @ apache::thrift::ThriftServer::serve() at ./thrift/lib/cpp2/server/ThriftServer.cpp:475
          @ apache::thrift::server::TServer::run() at ./thrift/lib/cpp/server/TServer.h:186
          @ apache::thrift::concurrency::PthreadThread::threadMain(void*) at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:200
          @ __tsan_thread_start_func at crtstuff.c:?
      
        Thread T371 (tid=639, running) created by thread T314 at:
          @ pthread_create at ??:?
          @ apache::thrift::concurrency::PthreadThread::start() at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:108
          @ apache::thrift::concurrency::ThreadManager::ImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::addWorker(unsigned long) at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:185
          @ apache::thrift::concurrency::PriorityThreadManager::PriorityImplT<folly::LifoSemImpl<std::atomic, folly::Baton<std::atomic, true, true> > >::start() at ./thrift/lib/cpp/concurrency/ThreadManager.tcc:840
          @ apache::thrift::ThriftServer::setup() at ./thrift/lib/cpp2/server/ThriftServer.cpp:347
          @ apache::thrift::ThriftServer::serve() at ./thrift/lib/cpp2/server/ThriftServer.cpp:475
          @ apache::thrift::server::TServer::run() at ./thrift/lib/cpp/server/TServer.h:186
          @ apache::thrift::concurrency::PthreadThread::threadMain(void*) at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:200
          @ __tsan_thread_start_func at crtstuff.c:?
      
        Thread T314 (tid=582, running) created by main thread at:
          @ pthread_create at ??:?
          @ apache::thrift::concurrency::PthreadThread::start() at ./thrift/lib/cpp/concurrency/PosixThreadFactory.cpp:108
          ...
      ```
      
      Looks like there is a data race in how `codelMinDelay_` is used. I couldn't get `std::atomic` to compile with `std::chrono::nanoseconds`,
      so I used `std::atomic<uint64_t>` and converted between `uint64_t` and time types appropriately.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D5759588
      
      fbshipit-source-id: 8213f3789808265ddfe5ab122f0f86490d0ea6ea
      88903796