1. 24 Jun, 2016 10 commits
    • Marcus Holland-Moritz's avatar
      Fix uses of std::nextafter on Android · d27a9dba
      Marcus Holland-Moritz authored
      Summary:
      On Android, std::nextafter isn't implemented. However, the C functions and
      compiler builtins are still provided.
      
      This change adds a portability abstraction as folly::nextafter.
      
      Reviewed By: mzlee, yfeldblum
      
      Differential Revision: D3478081
      
      fbshipit-source-id: 54fec1ca8bdec24ba45d51e07020259fdbae61b4
      d27a9dba
    • Huapeng Zhou's avatar
      IOBuf: add a method to signal the underlying buffer as externally shared · 523ca0ed
      Huapeng Zhou authored
      Summary:
      There are use cases where 1). the underlying buffer is externally managed (e.g. by a slab allocator) and 2). we need to do bookkeeping when the wrapped IOBuf gets destroyed (e.g. reference counting). This diff adds a another method to mark the underlying buffer as shared with the external memory management mechanism.
      
      The `takeOwnership` doesn't meet the criteria since it assumes the ownership of the buffer, while in this case we need to signal it as externally managed so that hopefully callers won't try to modify the underlying buffer.
      
      Reviewed By: simpkins
      
      Differential Revision: D2662954
      
      fbshipit-source-id: e908c3ebeeefe9a5d332c75070f377fb1dad5acb
      523ca0ed
    • Christopher Dykes's avatar
      std::aligned_storage<>::type is not a dependent type · 996d59be
      Christopher Dykes authored
      Summary: Which causes MSVC to get grumpy when you tell it that it is.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3479016
      
      fbshipit-source-id: e674b210aaa5a644c5ed884a7077a5cf33b05196
      996d59be
    • Christopher Dykes's avatar
      Use FOLLY_TLS rather than __thread · acac120e
      Christopher Dykes authored
      Summary: We define `FOLLY_TLS` for a reason, so use it.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3479880
      
      fbshipit-source-id: 2aa11c2900cdb012cf96d4f084fe81a0428f53d3
      acac120e
    • Christopher Dykes's avatar
      Dear Elias Fano Bit Vector: You do not require GCC · 73e35f02
      Christopher Dykes authored
      Summary: There is nothing directly in these that requires GCC.
      
      Reviewed By: pixelb
      
      Differential Revision: D3479392
      
      fbshipit-source-id: 6b5ae0115cad666f29db6c7b123b9d1a1013e3b0
      73e35f02
    • Marcus Holland-Moritz's avatar
      Fix code for anything-to-string space estimation · 0cc632cd
      Marcus Holland-Moritz authored
      Summary:
      When looking at the benchmark for 64-bit integer-to-string conversion,
      I noticed something strange:
      
        ===================================================
        folly/test/ConvBenchmark.cpp              time/iter
        ===================================================
        u64ToStringFollyMeasure(12)                 26.59ns
        u64ToStringFollyMeasure(13)                 26.89ns
        u64ToStringFollyMeasure(14)                 28.26ns  <---
        u64ToStringFollyMeasure(15)                 52.06ns  <---
        u64ToStringFollyMeasure(16)                 54.44ns
        u64ToStringFollyMeasure(17)                 55.96ns
        ===================================================
      
      There was a sudden, unexpected jump in latency going from 14 digits to
      15 digits. Profiling showed that this was due to malloc() and free()
      calls for the 15 digit benchmark that didn't occur when converting
      only 14 digit numbers. This was surprising, knowing that fbstrings
      should be able to store up to 23 digits inline.
      
      Even though the code to estimate the number of digits is correct, the
      code to estimate the space needed within the string was off by 9 bytes.
      
      The reason for that is that reserveInTarget() and reserveInTargetDelim()
      are called with the target string as the last parameter. However, the
      parameter processing in estimateSpaceToReserve() didn't consider this,
      and so reserved space for the size of the pointer + 1, which explains
      the wrap at 15 digits.
      
      The fix is to make all overloads of estimateSpaceToReserve() consider
      the target parameter correctly.
      
      The benchmark shows there's no jump in latency with the fix:
      
        ==============================================================
        folly/test/ConvBenchmark.cpp             time/iter   time/iter
        ==============================================================
        preallocateTestNoFloat                    590.12ns    599.20ns
        preallocateTestFloat                      580.25ns    581.72ns
        preallocateTestInt8                       116.27ns    119.08ns
        preallocateTestInt16                      130.03ns    131.89ns
        preallocateTestInt32                      156.24ns    154.91ns
        preallocateTestInt64                      210.66ns    207.04ns
        preallocateTestInt128                       4.56us      4.54us
        preallocateTestNoFloatWithInt128            4.27us      4.26us
        --------------------------------------------------------------
        u64ToStringFollyMeasure(1)                 15.49ns     15.19ns
        u64ToStringFollyMeasure(2)                 16.10ns     15.80ns
        u64ToStringFollyMeasure(3)                 17.32ns     17.01ns
        u64ToStringFollyMeasure(4)                 18.53ns     18.23ns
        u64ToStringFollyMeasure(5)                 18.84ns     18.53ns
        u64ToStringFollyMeasure(6)                 20.19ns     19.83ns
        u64ToStringFollyMeasure(7)                 21.42ns     21.11ns
        u64ToStringFollyMeasure(8)                 22.48ns     22.33ns
        u64ToStringFollyMeasure(9)                 22.94ns     22.63ns
        u64ToStringFollyMeasure(10)                24.12ns     23.82ns
        u64ToStringFollyMeasure(11)                25.53ns     25.25ns
        u64ToStringFollyMeasure(12)                26.59ns     26.36ns
        u64ToStringFollyMeasure(13)                26.89ns     26.67ns
        u64ToStringFollyMeasure(14)                28.26ns     28.01ns
        u64ToStringFollyMeasure(15)                52.06ns     29.44ns
        u64ToStringFollyMeasure(16)                54.44ns     31.05ns
        u64ToStringFollyMeasure(17)                55.96ns     34.64ns
        u64ToStringFollyMeasure(18)                57.69ns     35.10ns
        u64ToStringFollyMeasure(19)                59.45ns     36.46ns
        u64ToStringFollyMeasure(20)                60.91ns     38.17ns
        ==============================================================
      
      Reviewed By: meyering
      
      Differential Revision: D3455825
      
      fbshipit-source-id: 0146cbfc0105f0d709b64bcf1ed297c4e27d1129
      0cc632cd
    • Marcus Holland-Moritz's avatar
      Simplify unsigned-to-string conversion code and improve performance · d51ca176
      Marcus Holland-Moritz authored
      Summary:
      This seemingly trivial change has a surprisingly significant performance
      impact. It changes the call to append() on a string-like object from using
      an iterator pair to using a char* / length pair for 64-bit unsigned-to-string
      conversion. This brings it in line with code for signed-to-string conversion,
      which had already been using this overload of append.
      
        =============================================================
        folly/test/ConvBenchmark.cpp            time/iter   time/iter
        =============================================================
        preallocateTestNoFloat                   640.47ns    590.12ns
        preallocateTestFloat                     569.32ns    580.25ns
        preallocateTestInt8                      133.65ns    116.27ns
        preallocateTestInt16                     147.05ns    130.03ns
        preallocateTestInt32                     169.98ns    156.24ns
        preallocateTestInt64                     228.31ns    210.66ns
        preallocateTestInt128                      4.53us      4.56us
        preallocateTestNoFloatWithInt128           4.32us      4.27us
        -------------------------------------------------------------
        u64ToStringFollyMeasure(1)                17.32ns     15.49ns
        i64ToStringFollyMeasurePos(1)             15.80ns     15.80ns
        i64ToStringFollyMeasureNeg(1)             21.91ns     21.91ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(2)                18.23ns     16.10ns
        i64ToStringFollyMeasurePos(2)             16.71ns     16.71ns
        i64ToStringFollyMeasureNeg(2)             21.90ns     21.90ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(3)                19.44ns     17.32ns
        i64ToStringFollyMeasurePos(3)             17.01ns     17.01ns
        i64ToStringFollyMeasureNeg(3)             21.96ns     21.96ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(4)                20.35ns     18.53ns
        i64ToStringFollyMeasurePos(4)             18.23ns     18.23ns
        i64ToStringFollyMeasureNeg(4)             22.19ns     22.22ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(5)                20.66ns     18.84ns
        i64ToStringFollyMeasurePos(5)             19.47ns     19.54ns
        i64ToStringFollyMeasureNeg(5)             22.66ns     22.68ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(6)                21.89ns     20.19ns
        i64ToStringFollyMeasurePos(6)             20.74ns     20.72ns
        i64ToStringFollyMeasureNeg(6)             23.81ns     23.83ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(7)                23.09ns     21.42ns
        i64ToStringFollyMeasurePos(7)             21.11ns     21.12ns
        i64ToStringFollyMeasureNeg(7)             24.92ns     24.92ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(8)                24.00ns     22.48ns
        i64ToStringFollyMeasurePos(8)             22.18ns     22.18ns
        i64ToStringFollyMeasureNeg(8)             26.20ns     26.20ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(9)                24.31ns     22.94ns
        i64ToStringFollyMeasurePos(9)             23.39ns     23.53ns
        i64ToStringFollyMeasureNeg(9)             26.44ns     26.44ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(10)               25.52ns     24.12ns
        i64ToStringFollyMeasurePos(10)            24.69ns     24.69ns
        i64ToStringFollyMeasureNeg(10)            27.77ns     27.80ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(11)               26.74ns     25.53ns
        i64ToStringFollyMeasurePos(11)            25.07ns     25.07ns
        i64ToStringFollyMeasureNeg(11)            28.87ns     28.87ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(12)               28.25ns     26.59ns
        i64ToStringFollyMeasurePos(12)            26.21ns     26.34ns
        i64ToStringFollyMeasureNeg(12)            30.08ns     30.08ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(13)               29.38ns     26.89ns
        i64ToStringFollyMeasurePos(13)            27.60ns     27.65ns
        i64ToStringFollyMeasureNeg(13)            30.62ns     30.69ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(14)               30.91ns     28.26ns
        i64ToStringFollyMeasurePos(14)            28.58ns     28.57ns
        i64ToStringFollyMeasureNeg(14)            55.27ns     55.27ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(15)               54.71ns     52.06ns
        i64ToStringFollyMeasurePos(15)            52.79ns     52.84ns
        i64ToStringFollyMeasureNeg(15)            57.45ns     57.50ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(16)               57.14ns     54.44ns
        i64ToStringFollyMeasurePos(16)            55.26ns     55.29ns
        i64ToStringFollyMeasureNeg(16)            59.18ns     59.19ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(17)               58.89ns     55.96ns
        i64ToStringFollyMeasurePos(17)            57.10ns     57.14ns
        i64ToStringFollyMeasureNeg(17)            60.89ns     60.88ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(18)               60.33ns     57.69ns
        i64ToStringFollyMeasurePos(18)            58.59ns     58.63ns
        i64ToStringFollyMeasureNeg(18)            62.46ns     62.50ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(19)               62.22ns     59.45ns
        i64ToStringFollyMeasurePos(19)            60.23ns     60.25ns
        i64ToStringFollyMeasureNeg(19)            64.21ns     64.20ns
        -------------------------------------------------------------
        u64ToStringFollyMeasure(20)               63.79ns     60.91ns
        =============================================================
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3455819
      
      fbshipit-source-id: bc57a0e5bd1d1dca22a37c8b7306e05493e6bd5f
      d51ca176
    • Marcus Holland-Moritz's avatar
      Fix undefined behaviour in 128-bit integer-to-string conversion · f97b156e
      Marcus Holland-Moritz authored
      Summary:
      The code to convert signed 128-bit integer values to strings would trigger
      undefined behaviour when trying to convert the most negative possible value,
      as exposed by the new test cases.
      
      The fix is to negate the corresponding unsigned value (just like it's already
      done for the 64-bit code).
      
      This change doesn't have any performance impact.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3455817
      
      fbshipit-source-id: 83782992324f443789760a0e61cd9b889faaf317
      f97b156e
    • Marcus Holland-Moritz's avatar
      Add more benchmarks for integer-to-string conversion · 05a4c221
      Marcus Holland-Moritz authored
      Summary:
      In preparation for some changes to the integer-to-string conversion
      code, this change adds, this adds some more benchmarks, and attempts
      to update the existing ones to be less prone to the optimizations
      where the compiler already knows about the constant values being
      passed in.
      
      There also were a couple of flaws in the existing benchmarks, where
      instead of computing the value to be converted from a start value
      and the loop counter, it rather added the (constant) total iteration
      count to the value, ending up with a constant. But, worse than just
      using a constant, the code that was trying to evaluate the cost of
      converting a single-digit would generally end up computing the cost
      of a five-digit number, which resulted in the benchmarks showing
      identical figures regardless of the number of digits for small digit
      counts.
      
      The change also adds benchmarks for positive/negative signed integers
      and 128-bit integers.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3455815
      
      fbshipit-source-id: a20821c7d460bc05453655d0c848a0c9a47520fd
      05a4c221
    • Marcus Holland-Moritz's avatar
      Fix conversion from bool to floating point value · 29c7ba51
      Marcus Holland-Moritz authored
      Summary:
      Due to the definition of how floating point values convert to boolean,
      the check for undefined behaviour wouldn't work correctly. The result
      of (1 - 0.9999999999999999) would yield 0 when converted to an integer,
      but yields true (1) when converted to a boolean.
      
      As all floating point values can thus be converted to boolean without
      triggering undefined behaviour, this change overloads checkConversion()
      appropriately
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3477368
      
      fbshipit-source-id: 5b2aeb6194629cf3a6195529aac2362c0d35799c
      29c7ba51
  2. 23 Jun, 2016 2 commits
    • Marcus Holland-Moritz's avatar
      Clean up Conv.cpp / Conv.h · 1186ac53
      Marcus Holland-Moritz authored
      Summary:
      A bit of tidying up:
      
      - Remove unused digit1 / digit2 arrays
      - Remove unused MaxString<bool>
      - Move MaxString<> entirely to Conv.cpp, as it's not used in Conv.h
      - Extend anonymous namespace in Conv.cpp
      - Sort headers in Conv.h
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3433767
      
      fbshipit-source-id: 224a68f22505c0f2014ac376154d004eca1658a9
      1186ac53
    • Marcus Holland-Moritz's avatar
      Fix undefined behaviour in float<->int conversion · 47868e49
      Marcus Holland-Moritz authored
      Summary:
      This change fixes a case of undefined behaviour when converting between
      floating point and integral values using folly::to<>. Undefined behaviour
      is triggered when a floating point value is cast into an integral value
      that cannot represent the source value. This happens in both cases,
      float-to-int and int-to-float conversion, with folly::to<> due to the
      check for loss of precision.
      
      The new test cases expose the undefined behaviour.
      
      The fix is a series of extra checks, the majority of which will only
      kick in if the value to be converted is close to the boundary of the
      range of the target type. These checks ensure that the conversion will
      only be performed if the source value is within the range representable
      by the target type.
      
      The extra checks /will/ make the code slower. However, a later change
      in this series, which refactors the implementation of folly::to<>, will
      restore some of the performance.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3433757
      
      fbshipit-source-id: 43495d18f831206ef48f74332663263d789a4f8a
      47868e49
  3. 22 Jun, 2016 2 commits
    • Bruno Goncalves's avatar
      Added missing m4 file ax_boost_chrono · c1d4dcfe
      Bruno Goncalves authored
      Summary:
      To avoid error while running ./configure command:
       ./configure: line 18976: AX_BOOST_CHRONO: command not found
      
      Besides in my Fedora 23 the following error ocurred when not linked with -lboost_chrono running 'make check':
      /usr/bin/ld: SynchronizedTest.o: undefined reference to symbol 'boost::chrono::steady_clock::now()''
      /usr/lib64/libboost_chrono.so.1.58.0: error adding symbols: DSO missing from command line
      Closes https://github.com/facebook/folly/pull/426
      
      Differential Revision: D3457939
      
      Pulled By: elliottneilclark
      
      fbshipit-source-id: ec7a8d30d4812f197e2813e611cde0e33eab680a
      c1d4dcfe
    • Marcus Holland-Moritz's avatar
      Add more benchmarks for various conversions · 0232cb37
      Marcus Holland-Moritz authored
      Summary:
      This adds a couple of new benchmarks that will be used as a basis to
      check the performance of a series of upcoming changes to folly::to<>.
      
      It exercises both successful and unsuccessful conversion paths for
      string-to-anything, int-to-int, int-to-float, float-to-int, and pair-
      of-pointers-to-int conversions.
      
      The following table only shows the newly added benchmarks:
      
        ==============================================================
        folly/test/ConvBenchmark.cpp                time/iter  iters/s
        ==============================================================
        stringToBoolNumClassic                        12.76ns   78.37M
        stringToBoolNumClassicError                    3.19us  313.37K
        stringToBoolStrClassic                        17.92ns   55.79M
        stringToBoolStrClassicError                    3.21us  311.73K
        --------------------------------------------------------------
        stringToFloatNumClassic                       32.96ns   30.34M
        stringToFloatNumClassicError                   2.73us  366.49K
        stringToFloatStrClassic                       37.37ns   26.76M
        stringToFloatStrClassicError                   2.87us  348.81K
        stringToDoubleNumClassic                      31.30ns   31.95M
        stringToDoubleNumClassicError                  2.69us  371.26K
        stringToDoubleStrClassic                      37.67ns   26.54M
        stringToDoubleStrClassicError                  2.87us  348.97K
        --------------------------------------------------------------
        stringToCharSignedClassic                     16.71ns   59.85M
        stringToCharSignedClassicError                 3.87us  258.50K
        stringToCharUnsignedClassic                   15.49ns   64.54M
        stringToCharUnsignedClassicError               2.73us  366.88K
        stringToIntSignedClassic                      21.26ns   47.03M
        stringToIntSignedClassicError                  3.94us  253.82K
        stringToIntUnsignedClassic                    17.93ns   55.79M
        stringToIntUnsignedClassicError                2.72us  367.93K
        stringToLongLongSignedClassic                 34.63ns   28.88M
        stringToLongLongSignedClassicError             3.94us  253.52K
        stringToLongLongUnsignedClassic               51.04ns   19.59M
        stringToLongLongUnsignedClassicError           2.73us  366.58K
        --------------------------------------------------------------
        ptrPairToCharSignedClassic                     5.16ns  193.62M
        ptrPairToCharSignedClassicError                3.56us  280.99K
        ptrPairToCharUnsignedClassic                   2.43ns  411.44M
        ptrPairToCharUnsignedClassicError              2.63us  380.42K
        ptrPairToIntSignedClassic                      6.99ns  143.09M
        ptrPairToIntSignedClassicError                 4.08us  245.27K
        ptrPairToIntUnsignedClassic                    4.25ns  235.09M
        ptrPairToIntUnsignedClassicError               2.70us  370.55K
        ptrPairToLongLongSignedClassic                12.16ns   82.27M
        ptrPairToLongLongSignedClassicError            4.06us  246.17K
        ptrPairToLongLongUnsignedClassic              29.13ns   34.33M
        ptrPairToLongLongUnsignedClassicError          2.71us  369.33K
        --------------------------------------------------------------
        intToCharSignedClassic                       405.02ps    2.47G
        intToCharSignedClassicError                    2.10us  475.11K
        intToCharUnsignedClassic                     303.79ps    3.29G
        intToCharUnsignedClassicError                  2.10us  475.18K
        intToIntSignedClassic                        405.02ps    2.47G
        intToIntSignedClassicError                     1.99us  501.60K
        intToIntUnsignedClassic                      405.03ps    2.47G
        intToIntUnsignedClassicError                   2.09us  478.47K
        --------------------------------------------------------------
        intToFloatClassic                            545.11ps    1.83G
        intToFloatClassicError                         1.67us  599.38K
        --------------------------------------------------------------
        floatToFloatClassic                          759.47ps    1.32G
        floatToFloatClassicError                       6.45us  154.98K
        --------------------------------------------------------------
        floatToIntClassic                            637.82ps    1.57G
        floatToIntClassicError                         1.92us  520.16K
        ==============================================================
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3433745
      
      fbshipit-source-id: 6ab1ede32c07e7fc29b982e8705ecc0138fa6384
      0232cb37
  4. 21 Jun, 2016 1 commit
    • Lucian Grijincu's avatar
      folly:: singleton: ubsan: fix calling overriden method from ctor · 31fa09ca
      Lucian Grijincu authored
      Summary:
      Ubsan complains when overriden method is called from ctor:
      ```
      0x000000b04d40: note: object is of type 'folly::detail::SingletonHolder<XYZ>' 00 00 00 00  08 50 c3 8d da 7f 00 00  e8 4f c3 8d da 7f 00 00  18 0d 4c b4 da 7f 00 00  a0 16 90 00
                    ^~~~~~~~~~~~~~~~~~~~~~~
                    vptr for 'folly::detail::SingletonHolder<XYZ>'
      ```
      
      called from `folly::SingletonVault::registerSingleton(folly::detail::SingletonHolderBase*)`
      
      Reviewed By: ot
      
      Differential Revision: D3462037
      
      fbshipit-source-id: 6df283dd53df42d5d318990f60aba370ceed6395
      31fa09ca
  5. 20 Jun, 2016 1 commit
  6. 17 Jun, 2016 3 commits
    • Caren Thomas's avatar
      Add very basic compatibility with folly locks for synchronized · 3c4a013f
      Caren Thomas authored
      Summary: Add folly locks to the HasLockUnlock struct so that they can be used inside Synchronized. acquireReadWrite() and releaseReadWrite() functions are added to each lock class so that their .lock and .unlock methods are accessible by Synchronized. These changes allow an extremely basic level of compatibility for the purpose of running benchmarks and so compatibility with dual_locking, etc. have not been tested.
      
      Reviewed By: simpkins
      
      Differential Revision: D3434621
      
      fbshipit-source-id: d55cffbb1eccaf23645384b9a41f85c5df593ffe
      3c4a013f
    • Yedidya Feldblum's avatar
      Wrappers for some of OpenSSL's crypto hash functions · cc5485f8
      Yedidya Feldblum authored
      Summary:
      [Folly] Wrappers for some of OpenSSL's crypto hash functions.
      
      Wraps some of the OpenSSL crypto hash functions with variants that take `ByteRange` for input and `MutableByteRange` for output, and also variants that take `const IOBuf&` for input as well.
      
      These are a bit nicer to use than passing pointers and lengths separately.
      
      Reviewed By: ivmaykov
      
      Differential Revision: D3434562
      
      fbshipit-source-id: 3688ef11680a029b7664ac417a7781e70f9c6926
      cc5485f8
    • Christopher Dykes's avatar
      Fix infinite recursion in sorted_vector_{set|map}::insert(const value_type&) · b57cfc00
      Christopher Dykes authored
      Summary:
      We were calling ourself, which MSVC correctly identified:
      ```
      warning C4717: 'folly::sorted_vector_set<int,`anonymous namespace'::less_invert<int>,std::allocator<int>,void>::insert': recursive on all control paths, function will cause runtime stack overflow
      ```
      
      Just add an explicit `std::move` in to solve the problem.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3447922
      
      fbshipit-source-id: 803f79510b3dbfeea32a9629238448f69f5b78dc
      b57cfc00
  7. 16 Jun, 2016 4 commits
    • Jinlong Zhou's avatar
      Reverted commit D3270439 · 0f2aacae
      Jinlong Zhou authored
      Summary:
      [temp] (14)/6:
      > A function template, member function of a class template, variable template, or static data member of a class template shall be defined in every translation unit in which it is implicitly instantiated (14.7.1) unless the corresponding specialization is explicitly instantiated (14.7.2) in some translation unit; no diagnostic is required.
      
      `-Wundefined-var-template` warns on any implicit instantiations that are needed but could not be performed because the definition is not available. In particular, for valid code, this warns on templates/temploids which have their definition and all relevant explicit instantiations tucked away in some source file (but for which no explicit instantiation declarations are provided in the relevant header file) - used a few times in folly. This seems a bad style, the static data member template should either be defined in the header file or should be explicitly instantiated in each .cpp file.
      
      Reviewed By: igorsugak
      
      Differential Revision: D3270439
      
      fbshipit-source-id: e8cdb0452c2f6240a348b93cdbf9975813f27bfe
      0f2aacae
    • Christopher Dykes's avatar
      Use the standard intrinsics for crc32c · ddd5d517
      Christopher Dykes authored
      Summary: This mass of conditions is completely pointless, because GCC has supported the standard intrinsics since at least 4.4.7, which is as far back as godbolt lets me test.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3373640
      
      fbshipit-source-id: 619e971034db9249a9b312d18870bc7e4d579d50
      ddd5d517
    • Eric Niebler's avatar
      folly: fix clang's -Wundefined-var-template · 7570fc58
      Eric Niebler authored
      Summary:
      [temp] (14)/6:
      > A function template, member function of a class template, variable template, or static data member of a class template shall be defined in every translation unit in which it is implicitly instantiated (14.7.1) unless the corresponding specialization is explicitly instantiated (14.7.2) in some translation unit; no diagnostic is required.
      
      `-Wundefined-var-template` warns on any implicit instantiations that are needed but could not be performed because the definition is not available. In particular, for valid code, this warns on templates/temploids which have their definition and all relevant explicit instantiations tucked away in some source file (but for which no explicit instantiation declarations are provided in the relevant header file) - used a few times in folly. This seems a bad style, the static data member template should either be defined in the header file or should be explicitly instantiated in each .cpp file.
      
      Reviewed By: igorsugak
      
      Differential Revision: D3270439
      
      fbshipit-source-id: bf305fde3af575a265d65a0ae0bf95db5597587f
      7570fc58
    • Blake Lawson's avatar
      Added limited list of supported ciphers · 8fb2b024
      Blake Lawson authored
      Summary: Added method to enable server support for a specific elliptic curve encryption algorithm.
      
      Reviewed By: siyengar
      
      Differential Revision: D3432860
      
      fbshipit-source-id: 078531eead48ea156a68a109f8a62dc4907ac1ec
      8fb2b024
  8. 15 Jun, 2016 2 commits
    • Haocheng Zhang's avatar
      fix bug for nullptr in qfind · 1de25658
      Haocheng Zhang authored
      Summary: Fix bug for passing null pointer to memchr function, which requires the first argument to never be null.
      
      Reviewed By: luciang
      
      Differential Revision: D3432130
      
      fbshipit-source-id: 419924dd214d9f641d3d46335dae6abbe44ca751
      1de25658
    • Caren Thomas's avatar
      Add constructor for MultiLevelTimeSeries class that uses initializer_list and... · bd6447c6
      Caren Thomas authored
      Add constructor for MultiLevelTimeSeries class that uses initializer_list and add stat methods that uses duration as a parameter.
      
      Summary: Introduce a constructor that takes in an initializer list of 'TimeType' objects for the durations. New methods for sum/avg/rate/count/countrate are created with a 'TimeType' parameter - this makes it possible to call these methods using the duration that specifies the level. Previously, these methods could only be called using the index of the level in the levels_ vector. These methods first do a linear scan through levels_ using the method getLevelsByDuration to find the corresponding index, and then perform the function they specify on the level.
      
      Differential Revision: D3414343
      
      fbshipit-source-id: 8e1fcc16fd013d0b8b855a1eebbeff417e945b07
      bd6447c6
  9. 14 Jun, 2016 4 commits
    • Marcus Holland-Moritz's avatar
      Add conv_benchmark target to Makefile.am · 55c9d0bd
      Marcus Holland-Moritz authored
      Summary: It's useful to be able to build & run the benchmark.
      
      Differential Revision: D3433731
      
      fbshipit-source-id: c37bd5be3da0f89d4792747857d2e7548aea08ba
      55c9d0bd
    • Michael Lee's avatar
      Reverted commit D3427621 · f5bdf4a3
      Michael Lee authored
      Summary: The iOS sdk adds `clock_gettime` support.
      
      Reviewed By: clementgenzmer
      
      Differential Revision: D3427621
      
      fbshipit-source-id: 534276ba1e0ade185e3af0665f419f3c51d3f980
      f5bdf4a3
    • Joseph Griego's avatar
      EventBase keepAlive counter is not atomic · cafe469a
      Joseph Griego authored
      Summary: Since loopKeepAlive() is always used from the EventBase thread, there's no need for the overhead of an shared_ptr (and therefore, an atomic ref counter); we can get away without thread safety. This also allows us to discard the (sometimes incorrect) optimization of not returning a handle when it appears the loop will continue running anyways
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D3375503
      
      fbshipit-source-id: 474e4fcf992bdc4fcca9370d3c57bdcc4e042386
      cafe469a
    • Michael Lee's avatar
      Time.h portability for iOS 10. · f04cf0cd
      Michael Lee authored
      Summary: The iOS sdk adds `clock_gettime` support.
      
      Reviewed By: clementgenzmer
      
      Differential Revision: D3427621
      
      fbshipit-source-id: fcd3022c5ea05ceb8e289fbeb1ae845155d2dea9
      f04cf0cd
  10. 11 Jun, 2016 1 commit
    • Alexey Spiridonov's avatar
      DCHECK on reentrant invocations of loop() · 0806af8f
      Alexey Spiridonov authored
      Summary:
      I had a crash bug where an `EventBase` handler called a function, which tried to use the thread's EventBase as if it were its own:
      
      ```
      auto evb = folly::EventBaseManager::get()->getEventBase();
      // schedule work on evb, which calls evb->terminateLoopSoon() on completion
      evb->loopForever();
      ```
      
      This ended up invoking the `event_base_loop()` reentrantly, and corrupting the heap in a hard-to-debug way.
      
      Reviewed By: djwatson
      
      Differential Revision: D3408155
      
      fbshipit-source-id: b8855aa3b390fa33e032ab295d386122d2cb872a
      0806af8f
  11. 10 Jun, 2016 4 commits
    • Ben Hamilton's avatar
      Make Fibers library conditional on working Boost.Context fcontext_t · 52155e1d
      Ben Hamilton authored
      Summary:
      Boost 1.61 removes the `boost::context::fcontext_t` type
      which Folly Fibers depends on.
      
      This makes the Fibers library conditional on a working `fcontext_t`,
      so Folly will build (just without Fibers) if it's not present.
      
      Depends On D3419638
      
      Fixes https://github.com/facebook/folly/issues/413
      
      Reviewed By: Orvid
      
      Differential Revision: D3420097
      
      fbshipit-source-id: 876f8f76a2d0dda4ce5085c27875ab6aaa7b86c0
      52155e1d
    • Andrii Grynenko's avatar
      Fix folly::fibers on OSX with boost 1.60 · 6d52608a
      Andrii Grynenko authored
      Summary: We only need fcontext.hpp, so let's include it directly. all.hpp includes other headers, which use thread-locals (doesn't work with our OSX build).
      
      Reviewed By: igorsugak, bhamiltoncx
      
      Differential Revision: D3419638
      
      fbshipit-source-id: b4fa1bd14454bcd75eaece52c398ac6510273773
      6d52608a
    • Maged Michael's avatar
      Added support for std::mutex in folly Deterministic Schedule · 95c95660
      Maged Michael authored
      Summary:
      Added the class `DeterministicMutex`, a wrapper for `std::mutex`, in `folly/test/DeterministicSchedule.h`. Added a test to `folly/test/DeterministicScheduleTest.cpp` to test the correct behavior of `DeterministicMutex` functions and that deterministic schedule is able to detect race conditions that involve `DeterministicMutex`.
      
      Note: Bootcamp task
      
      Reviewed By: djwatson
      
      Differential Revision: D3412579
      
      fbshipit-source-id: c12861c4ec1cfeadcef027be4513e8e4cb7e0176
      95c95660
    • Marcus Holland-Moritz's avatar
      Get rid of circular dependency when including ExceptionWrapper.h from Conv.h · 500f3598
      Marcus Holland-Moritz authored
      Summary:
      This is needed in order to be able to use folly::Try<> with folly::to<> for
      non-throwing conversions.
      
      Reviewed By: meyering
      
      Differential Revision: D3411003
      
      fbshipit-source-id: 1f20e7871b9cedda2b35527dac70381579abd708
      500f3598
  12. 09 Jun, 2016 6 commits
    • Christopher Dykes's avatar
      Use intrinsics rather than inline assembly where possible · 1228a37d
      Christopher Dykes authored
      Summary:
      I would switch these to just use the intrinsic functions, but GCC 4.8 doesn't support them.
      MSVC supports the intrinsics, which is the primary reason for the switch.
      
      Reviewed By: philippv
      
      Differential Revision: D3278901
      
      fbshipit-source-id: 60103ac7cf7ddfb529f65f4aadc687dbdaf423a1
      1228a37d
    • Chad Parry's avatar
      Allow a timer with pending callbacks to be destroyed · 3f6e3b45
      Chad Parry authored
      Summary:
      This diff is part of a string of changes that is getting `HHWheelTimer` to use standard smart pointers.
      
      D2617966 is being reverted. The `DestructorGuard` that was added for safety is not possible without intrusive reference counting.
      That means that the `count_` (of pending callbacks) will still be correct, but there will be nothing to check it against. Because of that, I removed the assertions to make sure that the count of pending callbacks matches the count of active guards. Anyway, there were already ways to defeat that test, such as by creating a `DestructorGuard` from any client code.
      As long as the assertions are gone, the `cancelAll` can be moved to the destructor. It only ever got run when `destroy` was called and `count_` was `0`, which means that `~HHWheelTimer` was also going to get called at the same time.
      
      Reviewed By: djwatson
      
      Differential Revision: D3349303
      
      fbshipit-source-id: 433fa6605ee9921833328e2f82bd07b2e17e42c5
      3f6e3b45
    • pravic's avatar
      Fix typo in docs/Function.md · 2488a9d5
      pravic authored
      Summary: Closes https://github.com/facebook/folly/pull/421
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3413832
      
      Pulled By: elliottneilclark
      
      fbshipit-source-id: 7af1462c250c8d6b5d6f5dfcb3f3117dff7877c9
      2488a9d5
    • Martin Martin's avatar
      Fix a data race found by TSAN in folly::fibers::Baton · e967876f
      Martin Martin authored
      Summary: Fix a data race found by TSAN in folly::fibers::Baton by changing a memory_order_relaxed to memory_order_acquire.  Nathan Bronson says that TSAN is correct and the C++ memory model requires _acquire here.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D3412519
      
      fbshipit-source-id: bd0043b41d145e689a97fc7ef47aa6e116ea9194
      e967876f
    • David Callahan's avatar
      fix command line parsing · 3619ec97
      David Callahan authored
      Summary: parse command line flags to pick up -json flag
      
      Reviewed By: mzlee
      
      Differential Revision: D3405794
      
      fbshipit-source-id: e2d216c74f04c15d7470c70abfc2bd25c2ceda98
      3619ec97
    • Brett Simmers's avatar
      Allow const mapped types in folly::AtomicHash(Array|Map) · d4c0d267
      Brett Simmers authored
      Summary:
      Without this const_cast, it's impossible to insert anything into an
      AHA with a const mapped_type, making it effectively useless.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D3405687
      
      fbshipit-source-id: 3ecba19e0e92661c2c537c747b4927176104939f
      d4c0d267