1. 24 Jun, 2018 1 commit
    • 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
  2. 23 Jun, 2018 5 commits
    • Yedidya Feldblum's avatar
      Be explicit about memory orders in Futures · 01336b86
      Yedidya Feldblum authored
      Summary:
      [Folly] Be explicit about memory orders in Futures.
      
      This clarifies the basic purpose of each atomic variable - namely, whether it protects control flow (relaxed) v.s. state (typically acq/rel).
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D8472791
      
      fbshipit-source-id: 350ec9b38d7c36cfb6d9ae9f1abf758b1f2e97ba
      01336b86
    • Andrii Grynenko's avatar
      Implement coro::Future<void>::toFuture() · dcbf6db1
      Andrii Grynenko authored
      Summary: When converting to folly::Future we have to perform the void -> folly::Unit conversion.
      
      Differential Revision: D8463177
      
      fbshipit-source-id: 96312d0447dfc381a0ee586030f21b9cdbf4bee4
      dcbf6db1
    • Yedidya Feldblum's avatar
      Fix Range with clang + opt builds + ASAN · 184dd587
      Yedidya Feldblum authored
      Summary: [Folly] Fix Range with clang + opt builds + ASAN, where functions marked with `__attribute__((__noinline__))` are getting inlined.
      
      Reviewed By: nbronson
      
      Differential Revision: D8597928
      
      fbshipit-source-id: c963feea270b9e28e118d196950b04d8457b9c66
      184dd587
    • Yedidya Feldblum's avatar
      Fix incorrect unaligned load in Range · 19a78f65
      Yedidya Feldblum authored
      Summary: [Folly] Fix incorrect unaligned load in `Range`.
      
      Reviewed By: santazhang
      
      Differential Revision: D8597638
      
      fbshipit-source-id: 2c8c0baa0c90fb7a7d5a24f84686d3993ae8455b
      19a78f65
    • Nathan Bronson's avatar
      software prefetching for F14Value iteration · 3bcbf9d9
      Nathan Bronson authored
      Summary:
      When moving from chunk i to i-1 in an F14{Value,Node}{Map,Set}
      iteration, this diff prefetches chunk i-2.  This code will never be run
      for small maps and sets, since they fit in a single chunk, and it does
      not affect the fast-path of intra-chunk operator++.
      
      Reviewed By: shixiao
      
      Differential Revision: D8395569
      
      fbshipit-source-id: 60cace5997222fd7d1fa03ffcee93f439f2fcf03
      3bcbf9d9
  3. 22 Jun, 2018 8 commits
    • Nick Terrell's avatar
      Support negative compression levels · 28a03e7e
      Nick Terrell authored
      Summary:
      Folly uses level [-1, -3] for the default/fastest/best compression levels.
      Introduce a `ZSTD_FAST` codec to use negative compression levels.
      
      Reviewed By: chipturner
      
      Differential Revision: D8529340
      
      fbshipit-source-id: 7fb7ff65f08d4dcab009c2eb073920b53055ed9b
      28a03e7e
    • Yedidya Feldblum's avatar
      One Core alias in Promise and Future · abc3bfdf
      Yedidya Feldblum authored
      Summary: [Folly] One `Core` alias in `Promise` and `Future`. Having two aliases was odd.
      
      Reviewed By: marshallcline
      
      Differential Revision: D8472386
      
      fbshipit-source-id: fb2241445e100927602faed9d89775534d06d10a
      abc3bfdf
    • Yedidya Feldblum's avatar
      Refactor non-variadic collect variants · a8990a74
      Yedidya Feldblum authored
      Summary:
      [Folly] Refactor non-variadic `collect` variants.
      
      No change in behavior - just moving code around.
      
      Reviewed By: marshallcline
      
      Differential Revision: D8440630
      
      fbshipit-source-id: a6349c73c2109237f1be174c2260e9c9eb2d1c0e
      a8990a74
    • Yedidya Feldblum's avatar
      Refactor variadic collect and collectAll · 698d1e78
      Yedidya Feldblum authored
      Summary:
      [Folly] Refactor variadic `collect` and `collectAll`.
      
      No change in behavior - just moving code around. Principally, moving related code closer together, such as moving helper context types into the functions which use them.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D8416843
      
      fbshipit-source-id: 3637c46c073191ae2dabc78cbaa145fe34cca220
      698d1e78
    • Dilip Joseph's avatar
      Revert D8304491: [folly] Use folly Hash to hash strings in dynamic · 007670a6
      Dilip Joseph authored
      Differential Revision:
      D8304491
      
      Original commit changeset: 9988e9012c31
      
      fbshipit-source-id: cc88b31cfb65e3dbc0a2b8f7fbcc565a28a796f9
      007670a6
    • Nathan Bronson's avatar
      fix test on 32-bit platforms · e96aa455
      Nathan Bronson authored
      Summary:
      Folly hasher for integers is avalanching on 32-bit platforms,
      which is properly handled by the associated traits.  This diff fixes
      the unit tests to match.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8584675
      
      fbshipit-source-id: 5895b2ad8d82afdef2bf277819bb6e3fff56d99a
      e96aa455
    • Yang Zhang's avatar
      add optional thread finalizer to InitThreadFactory · 5e03c4db
      Yang Zhang authored
      Summary: Optional thread finalizer can help do cleanup work before thread exit.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8576224
      
      fbshipit-source-id: b9ecd1b790b1935616fbe71c870dad82ec379b4e
      5e03c4db
    • Nathan Bronson's avatar
      uint64_t -> size_t for 32-bit support · fae10d94
      Nathan Bronson authored
      Summary:
      On 64-bit platforms uint64_t and std::size_t are the same
      size, but that is not the case on 32-bit platforms such as arm or x86.
      This diff makes folly/io 32-bit clean, at least to the point that it
      compiles and passes unit tests.  There is no change to behavior on
      64-bit platforms.
      
      Reviewed By: shixiao
      
      Differential Revision: D8559702
      
      fbshipit-source-id: c61a5d3d0e327f36cdf9a606a48a256943efc098
      fae10d94
  4. 21 Jun, 2018 7 commits
    • Nathan Bronson's avatar
      fix MemoryTest for platforms without constexpr std::max · 8fbd6d60
      Nathan Bronson authored
      Reviewed By: Orvid
      
      Differential Revision: D8577555
      
      fbshipit-source-id: 9fa46102f9acf17ab4cc5412c136df17eb8982c4
      8fbd6d60
    • Nathan Bronson's avatar
      fix MemoryTest for 32-bit platforms · 511a163f
      Nathan Bronson authored
      Summary: This diff makes folly/test/memoryTest pass on 32-bit platforms.
      
      Reviewed By: shixiao
      
      Differential Revision: D8559725
      
      fbshipit-source-id: 472c184a655c1330f71f9f594f8804bec23e4c60
      511a163f
    • Dan Melnic's avatar
      Add ThreadLocal::accessAllThreads benchmark · 8080bbbd
      Dan Melnic authored
      Summary: Add ThreadLocal::accessAllThreads benchmark
      
      Reviewed By: djwatson
      
      Differential Revision: D8555358
      
      fbshipit-source-id: 44da3830df96183158d3641fc4611c8e36364c00
      8080bbbd
    • Nathan Bronson's avatar
      clang-format folly/io subdir · 928ed23a
      Nathan Bronson authored
      Summary: Automated reformat of folly/io subdir in preparation for other changes
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8559473
      
      fbshipit-source-id: c94d9c05ee77e25b6a61ee7a47b472ccea1f18f3
      928ed23a
    • Alex Wang's avatar
      Fix some `CMAKE_REQUIRED_FLAGS` stuff (#811) · 38589135
      Alex Wang authored
      Summary:
      This fixes two issues related to CMAKE_REQUIRED_FLAGS
      
      ----
      
      CMAKE_REQUIRED_FLAGS, unlike the other CMAKE_REQUIRED_* variables, is a
      string, not a list. A list with more than one item in
      CMAKE_REQUIRED_FLAGS results in a semicolon showing up in the middle of
      the command line for at least check_symbol_exists and check_type_size
      calls, prematurely terminating the compilation command and resulting in
      potentially incorrect CMake test failures.
      
      For example, CMake fails to determine the size of __int128 on macOS
      10.13.3, with Apple Clang 9 (clang-900.0.39.2), even though __int128 is
      supported for this platform, as the following C program
      
          int main() {
              __int128 i;
          }
      
      compiles successfully with the command "clang test.c". CMake fails to
      compile a program with __int128 for an entirely different reason:
      
          Building CXX object CMakeFiles/cmTC_d7e3f.dir/INT128_SIZE.cpp.o
          /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -DGFLAGS_IS_A_DLL=0 -isystem /usr/local/include -I/usr/local/opt/openssl@1.1/include  -fsanitize=address,undefined -std=gnu++14;-Werror=unknown-warning-option   -o CMakeFiles/cmTC_d7e3f.dir/INT128_SIZE.cpp.o -c /Users/awang/code/CRES/scc-analysis/build-debug/CMakeFiles/CheckTypeSize/INT128_SIZE.cpp
          clang: error: no input files
          /bin/sh: -Werror=unknown-warning-option: command not found
          make[1]: *** [CMakeFiles/cmTC_d7e3f.dir/INT128_SIZE.cpp.o] Error 127
          make: *** [cmTC_d7e3f/fast] Error 2
      
      Using set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} <new_flag>")
      avoids this problem.
      
      ----
      
      CMAKE_REQUIRED_FLAGS is given to both C and C++ compiler invocations.
      The C++-specific flag -std=gnu++14 causes compilation to fail on Apple
      LLVM 9.1.0 (clang-902.0.39.2) with errors along the lines of:
      
          Building C object CMakeFiles/cmTC_af532.dir/CheckSymbolExists.c.o
          /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -DGFLAGS_IS_A_DLL=0 -isystem /usr/local/include -I/usr/local/opt/openssl@1.1/include  -std=gnu++14   -o CMakeFiles/cmTC_af532.dir/CheckSymbolExists.c.o   -c /Users/awang/code/CRES/scc-analysis/build-debug/CMakeFiles/CMakeTmp/CheckSymbolExists.c
          error: invalid argument '-std=gnu++14' not allowed with 'C/ObjC'
          make[1]: *** [CMakeFiles/cmTC_af532.dir/CheckSymbolExists.c.o] Error 1
          make: *** [cmTC_af532/fast] Error 2
      
      The affected functions are:
      
        - pthread_atfork
        - memrchr
        - preadv
        - pwritev
        - clock_gettime
        - cplus_demangle_v3_callback
        - malloc_usable_size
      
      Of these, only pthread_atfork and clock_gettime were detected as being
      absent when they were actually present.
      
      The failure to correctly identify the presence of pthread_atfork, at
      least, can cause Folly to fail to build on macOS because Folly requires
      pthread_atfork for macOS but thinks it is absent due to the failed test.
      Closes https://github.com/facebook/folly/pull/811
      
      Reviewed By: simpkins
      
      Differential Revision: D7502576
      
      Pulled By: yfeldblum
      
      fbshipit-source-id: a508e432e460cf5492e5c74da7c8b1190ec923a3
      38589135
    • Yedidya Feldblum's avatar
      constexpr_find_first_set, constexpr_find_last_set · 09d75f08
      Yedidya Feldblum authored
      Summary: [Folly] `constexpr_find_first_set`, `constexpr_find_last_set`; with an application into `F14Table`.
      
      Reviewed By: nbronson
      
      Differential Revision: D8529579
      
      fbshipit-source-id: 90d02215001abf1ffb3f04550eda22021263bbb1
      09d75f08
    • Yedidya Feldblum's avatar
      Fix narrowing conversion in folly::popcount · fd346480
      Yedidya Feldblum authored
      Summary: [Folly] Fix narrowing conversion in `folly::popcount`.
      
      Reviewed By: ot, nbronson
      
      Differential Revision: D8555467
      
      fbshipit-source-id: fdef83fc05e3e595087e7b8a3aba98400e5a954a
      fd346480
  5. 20 Jun, 2018 15 commits
    • Xiao Shi's avatar
      fix bugs in fallback F14 containers · 101ad63e
      Xiao Shi authored
      Summary:
      Previously, `visitContiguousRanges` for fallback F14 sets did not build and
      `visitAllocationClasses` was invoking the visitor with the wrong order.
      
      This diff fixes these bugs and moves the tests so that it'll get run regardless
      of whether vector intrinsics are available.
      
      Reviewed By: nbronson
      
      Differential Revision: D8542771
      
      fbshipit-source-id: 3aee3ab9e3278110ec8349bd9c858d19df779eb1
      101ad63e
    • Giuseppe Ottaviano's avatar
      Use folly Hash to hash strings in dynamic · b1a0a138
      Giuseppe Ottaviano authored
      Summary:
      There should be no expectations on what hash is internally
      used in dynamic, so we don't need to maintain compatibility with
      `FBString`, which hasn't been used as string storage in `dynamic` for
      quite a while.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8304491
      
      fbshipit-source-id: 9988e9012c31b894746488494dd644054492def3
      b1a0a138
    • Daniel Xu's avatar
      Appease gcc-8 warnings (#869) · 7a46e6ee
      Daniel Xu authored
      Summary:
      GCC 8 introduces a new `class-memaccess` warning. The compiler rightly complains about `memcpy`-ing a non-POD datatype even though we know it's ok. Casting to `void*` before `memcpy` silences the compiler warning.
      Closes https://github.com/facebook/folly/pull/869
      
      Reviewed By: simpkins
      
      Differential Revision: D8475831
      
      Pulled By: danobi
      
      fbshipit-source-id: c0f4eb9a653803cc912be1c6148f50ab71a8c6ab
      7a46e6ee
    • Nathan Bronson's avatar
      fewer random tests for TDigest · 3364a725
      Nathan Bronson authored
      Summary:
      The tdigest_test is sometimes timing out on the Travis CI build,
      perhaps because it runs the tests sequentially rather than in parallel
      as under buck.  This diff reduces the size of the random tests.  At the
      reduced size it was slightly exceeding the hard-coded expected accuracy
      bounds, so the diff also loosens those.
      
      This is a test-only change.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8548385
      
      fbshipit-source-id: f78aee6aa22d59b297c2aef757da1dc9e0831052
      3364a725
    • Daniel Xu's avatar
      Fix libfollylogging link dependency (#872) · f1e13ac2
      Daniel Xu authored
      Summary:
      The folly logging library introduced a new shared library:
      libfollylogging. folly::init recently started to depend on on
      libfollylogging's initLoggingOrDie(). The problem is that libfolly is
      never linked with libfollylogging, leading to the following error
      upon application link time:
      
          /usr/local/lib/libfolly.so: undefined reference to
          folly::initLoggingOrDie(folly::Range<char const*>)
      
      This patch forces libfollylogging to implicitly link with libfolly
      through the removal of libfollylogging altogether.
      
      Note that logging/InitWeak.cpp has been added to the source list.
      This was previously omitted.
      Closes https://github.com/facebook/folly/pull/872
      
      Reviewed By: simpkins
      
      Differential Revision: D8530795
      
      Pulled By: danobi
      
      fbshipit-source-id: 280fbc2170364621e9a682ae38cf812c23bde5e5
      f1e13ac2
    • Yedidya Feldblum's avatar
      Better control over ASAN disabling in Range · f124d94d
      Yedidya Feldblum authored
      Summary:
      [Folly] Better control over ASAN disabling in `Range` SSE42 functions.
      
      Just disable ASAN for the specific loads which are at risk of reading memory slightly past the end of the given buffers.
      
      Reviewed By: ot, nbronson
      
      Differential Revision: D8473594
      
      fbshipit-source-id: a93565137feae7500e1588eb239ff21f01530e25
      f124d94d
    • Yedidya Feldblum's avatar
      Smaller implementations for findFirstSet, findLastSet · 33b7fa2d
      Yedidya Feldblum authored
      Summary: [Folly] Smaller implementations for `findFirstSet`, `findLastSet`.
      
      Reviewed By: nbronson
      
      Differential Revision: D8471816
      
      fbshipit-source-id: 699af98d404e6dd76df02e344d09c850abc1c32f
      33b7fa2d
    • Yedidya Feldblum's avatar
      Split BitIterator test and bench · e0122b40
      Yedidya Feldblum authored
      Summary: [Folly] Split BitIterator test and bench, improving the benchmark in some small ways, and fixing missing `std::iterator_traits` applications along the way.
      
      Reviewed By: nbronson
      
      Differential Revision: D8509129
      
      fbshipit-source-id: 0fad0ce4d1c5abf76e33e04e98db36912e9cb651
      e0122b40
    • Nathan Bronson's avatar
      use a single malloc/free call for F14VectorMap and Set · ff9d6fee
      Nathan Bronson authored
      Summary:
      Before this diff the vector storage policy for F14 allocated the
      chunk array and the value_type array via separate calls to the allocator.
      After this diff they are performed via a single allocation using a byte
      allocator rebound from the original value allocator.  This will halve
      the number of calls to malloc and free from a majority of F14FastMap-s
      and F14FastSet-s (and from all F14VectorMap and F14VectorSet).
      The optimization is likely to be most important for small sets and maps.
      
      In a microbenchmark that just creates and destroys 1-element
      F14VectorMap-s, this diff was a 20% CPU win.
      
      This diff is not pure win.  The unified allocation of
      `(64+10*sizeof(value_type))*N` causes more internal fragmentation in
      jemalloc for most value_type sizes than separate allocations of `64*N`
      and `10*sizeof(value_type)*N`.  48-byte value_type is probably the most
      affected in practice; this diff will increase the memory footprint
      of vector-policy tables with 48-byte keys by 13% once internal memory
      fragmentation is taken into account.
      
      Taking into account the default jemalloc allocation classes,
      
          sizeof(value_type)  |  footprint change
          --------------------|--------------------
                         24   |   1.03797
                         32   |   1.
                         40   |   1.07462
                         48   |   1.1273
                         56   |   1.0185
                         64   |   1.06558
                         72   |   1.02742
                         80   |   1.02672
                         88   |   1.
                         96   |   1.
                        104   |   1.05961
                        112   |   1.05849
                        120   |   0.965071
                        128   |   1.10305
                        136   |   0.942188
                        144   |   0.942984
                        152   |   1.05624
                        160   |   1.05549
                        168   |   0.927757
                        176   |   1.0238
                        184   |   1.02353
                        192   |   1.02327
                        200   |   1.08255
                        208   |   1.08173
                        216   |   1.08093
                        224   |   1.08015
                        232   |   0.981946
                        240   |   0.982102
                        248   |   0.982255
                        256   |   1.12316
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8485933
      
      fbshipit-source-id: 1a7df390e11e71e1f56f23527aebec4806eb03d1
      ff9d6fee
    • Xiao Shi's avatar
      restrict availability on 32-bit platforms · 3c509ce1
      Xiao Shi authored
      Summary:
      Restrict F14 availability (and use the fallback version) on 32-bit platforms
      until we audit the code, removing assumptions such as `size_t` is 64-bit and
      finding a mixer that does not require `__int128`.
      
      Reviewed By: nbronson
      
      Differential Revision: D8525351
      
      fbshipit-source-id: 54fce48fe94235c8525074216426cf254db26b4e
      3c509ce1
    • Dan Melnic's avatar
      Fix broken build due to "missing braces around initializer" error · 67f5e1ea
      Dan Melnic authored
      Summary: Fix broken build due to "missing braces around initializer" error
      
      Reviewed By: nbronson
      
      Differential Revision: D8541080
      
      fbshipit-source-id: f73f973c575b6d3dad999a454d1306f7608122c7
      67f5e1ea
    • Xiao Shi's avatar
      skip recording policy name in computeStats when RTTI is disabled · 16a2a017
      Xiao Shi authored
      Summary:
      If RTTI is disabled for the compilation unit, simply skip recording the type of
      F14Policy in computeStats.
      
      This diff also contains a few fixes for when folly is built without RTTI.
      
      Reviewed By: nbronson
      
      Differential Revision: D8523618
      
      fbshipit-source-id: dfbfa93ec462c0ff72c06b9f65d61b081e361f41
      16a2a017
    • Caleb Marchent's avatar
      Remove F14Memory.h header file from Makefile.am (#874) · 121274ac
      Caleb Marchent authored
      Summary:
      The headerfile was removed from the source tree, but is still
      referenced, causing autotools based builds to fail.
      Closes https://github.com/facebook/folly/pull/874
      
      Reviewed By: nbronson
      
      Differential Revision: D8531520
      
      Pulled By: calebmarchent
      
      fbshipit-source-id: 33844e57f4551a66dd13ab9ec03a441c7779c41e
      121274ac
    • Alex Guzman's avatar
      Include AsyncSocketTest.h to list of exported test headers · 1ed5d00c
      Alex Guzman authored
      Summary: Adds header to the test headers exported by folly
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8524926
      
      fbshipit-source-id: 06983789c3ee9e403211fb5335365663878c2590
      1ed5d00c
    • Jorge Lopez Silva's avatar
      Add pause/resume support to AsyncUDPServerSocket · df63a8e5
      Jorge Lopez Silva authored
      Summary: Extend AsyncUDPServerSocket to support dynamically pausing/resuming reading from the underlying socket. This functionality already exists for AsyncServerSocket but not for UDP server sockets.
      
      Reviewed By: djwatson
      
      Differential Revision: D8358256
      
      fbshipit-source-id: 7d5cf14b656ef9280747515b23cd0ae2899ec38b
      df63a8e5
  6. 19 Jun, 2018 4 commits
    • Jason Fried's avatar
      Don't raise ignored exception return nullptr instead · 9a34add5
      Jason Fried authored
      Summary:
      Sometimes get_executor gets called from threads where there is no asyncio evenloop.
      In those cases return NULL.
      
      The caller is responsible for this situation.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D8492709
      
      fbshipit-source-id: 325689ecd4541b9ba097cfe1cb4d6d61ad81cb43
      9a34add5
    • Nathan Bronson's avatar
      pack ItemIter using alignment bits rather than high bits · 64eca5b8
      Nathan Bronson authored
      Summary:
      Using the alignment bits to store the index for a packed
      iterator is one of the steps toward better support of 32-bit platforms
      (and pointer authentication in future platforms, such as ARMv8.3-A).
      Previously this was complicated by a desire to make construction of
      a packed ItemIter as cheap as possible.  The ItemPtr has a variable
      number of bits available due to alignment, which may not be sufficient
      to encode the index.  This diff observes that we can piggyback on the
      chunk alignment to efficiently deduce the remaining bits of the index.
      If sizeof(Item) gives us only 2 bits of alignment, for example, then we
      can deduce 2 bits of the index from the Item*.
      
      Differential Revision: D8452991
      
      fbshipit-source-id: 40dfd9957da3733090bb947646c553620cc7d33d
      64eca5b8
    • Maged Michael's avatar
      hazptr: cleanup checks for newly retired objects · 9d0b6c65
      Maged Michael authored
      Summary: Cleanup checks if the current thread has retired objects during bulk reclaim. It does so by flushing the thread local set of retired objects and checking if domain's list of retired objects.
      
      Reviewed By: djwatson
      
      Differential Revision: D8503159
      
      fbshipit-source-id: 59ddd29d8ae1429b62b5bc9511b84e4c9e7128f2
      9d0b6c65
    • Maged Michael's avatar
      hazptr: Add domain shutdown check in object retire · 80d0a7ab
      Maged Michael authored
      Summary: Add shutdown indicator to domain to be checked in retire to avoid accessing thread local private list of objects at shutdown time when the thread local structure may be already destroyed.
      
      Reviewed By: djwatson
      
      Differential Revision: D8501530
      
      fbshipit-source-id: 16adef34f2fd265f35851c792bd9e62a2f19b81a
      80d0a7ab