Christopher Dykes [Fri, 24 Jun 2016 17:42:45 +0000 (10:42 -0700)]
std::aligned_storage<>::type is not a dependent type
Summary: Which causes MSVC to get grumpy when you tell it that it is.
Reviewed By: yfeldblum
Differential Revision:
D3479016
fbshipit-source-id:
e674b210aaa5a644c5ed884a7077a5cf33b05196
Christopher Dykes [Fri, 24 Jun 2016 17:42:21 +0000 (10:42 -0700)]
Use FOLLY_TLS rather than __thread
Summary: We define `FOLLY_TLS` for a reason, so use it.
Reviewed By: yfeldblum
Differential Revision:
D3479880
fbshipit-source-id:
2aa11c2900cdb012cf96d4f084fe81a0428f53d3
Christopher Dykes [Fri, 24 Jun 2016 17:40:14 +0000 (10:40 -0700)]
Dear Elias Fano Bit Vector: You do not require GCC
Summary: There is nothing directly in these that requires GCC.
Reviewed By: pixelb
Differential Revision:
D3479392
fbshipit-source-id:
6b5ae0115cad666f29db6c7b123b9d1a1013e3b0
Marcus Holland-Moritz [Fri, 24 Jun 2016 02:38:40 +0000 (19:38 -0700)]
Fix code for anything-to-string space estimation
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
Marcus Holland-Moritz [Fri, 24 Jun 2016 02:36:52 +0000 (19:36 -0700)]
Simplify unsigned-to-string conversion code and improve performance
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
Marcus Holland-Moritz [Fri, 24 Jun 2016 02:34:48 +0000 (19:34 -0700)]
Fix undefined behaviour in 128-bit integer-to-string conversion
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
Marcus Holland-Moritz [Fri, 24 Jun 2016 02:04:09 +0000 (19:04 -0700)]
Add more benchmarks for integer-to-string conversion
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
Marcus Holland-Moritz [Fri, 24 Jun 2016 00:22:33 +0000 (17:22 -0700)]
Fix conversion from bool to floating point value
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
Marcus Holland-Moritz [Thu, 23 Jun 2016 03:28:37 +0000 (20:28 -0700)]
Clean up Conv.cpp / Conv.h
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
Marcus Holland-Moritz [Thu, 23 Jun 2016 03:28:36 +0000 (20:28 -0700)]
Fix undefined behaviour in float<->int conversion
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
Bruno Goncalves [Wed, 22 Jun 2016 20:25:33 +0000 (13:25 -0700)]
Added missing m4 file ax_boost_chrono
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
Marcus Holland-Moritz [Wed, 22 Jun 2016 00:26:01 +0000 (17:26 -0700)]
Add more benchmarks for various conversions
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
Lucian Grijincu [Tue, 21 Jun 2016 20:40:46 +0000 (13:40 -0700)]
folly:: singleton: ubsan: fix calling overriden method from ctor
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
Christopher Dykes [Mon, 20 Jun 2016 18:29:55 +0000 (11:29 -0700)]
Adjust the way Future<Unit>'s constructor is defined
Summary: This is needed to work around a limitation in MSVC's SFINAE support.
Reviewed By: yfeldblum
Differential Revision:
D3271292
fbshipit-source-id:
88052beaa97a297c6eb3eb5047c8fed48c8155af
Caren Thomas [Fri, 17 Jun 2016 18:24:54 +0000 (11:24 -0700)]
Add very basic compatibility with folly locks for synchronized
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
Yedidya Feldblum [Fri, 17 Jun 2016 01:30:25 +0000 (18:30 -0700)]
Wrappers for some of OpenSSL's crypto hash functions
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
Christopher Dykes [Fri, 17 Jun 2016 01:12:47 +0000 (18:12 -0700)]
Fix infinite recursion in sorted_vector_{set|map}::insert(const value_type&)
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
Jinlong Zhou [Thu, 16 Jun 2016 20:26:54 +0000 (13:26 -0700)]
Reverted commit
D3270439
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
Christopher Dykes [Thu, 16 Jun 2016 19:42:33 +0000 (12:42 -0700)]
Use the standard intrinsics for crc32c
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
Eric Niebler [Thu, 16 Jun 2016 17:08:54 +0000 (10:08 -0700)]
folly: fix clang's -Wundefined-var-template
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
Blake Lawson [Thu, 16 Jun 2016 01:21:44 +0000 (18:21 -0700)]
Added limited list of supported ciphers
Summary: Added method to enable server support for a specific elliptic curve encryption algorithm.
Reviewed By: siyengar
Differential Revision:
D3432860
fbshipit-source-id:
078531eead48ea156a68a109f8a62dc4907ac1ec
Haocheng Zhang [Wed, 15 Jun 2016 03:25:09 +0000 (20:25 -0700)]
fix bug for nullptr in qfind
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
Caren Thomas [Wed, 15 Jun 2016 00:52:36 +0000 (17:52 -0700)]
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
Marcus Holland-Moritz [Tue, 14 Jun 2016 23:47:40 +0000 (16:47 -0700)]
Add conv_benchmark target to Makefile.am
Summary: It's useful to be able to build & run the benchmark.
Differential Revision:
D3433731
fbshipit-source-id:
c37bd5be3da0f89d4792747857d2e7548aea08ba
Michael Lee [Tue, 14 Jun 2016 00:50:11 +0000 (17:50 -0700)]
Reverted commit
D3427621
Summary: The iOS sdk adds `clock_gettime` support.
Reviewed By: clementgenzmer
Differential Revision:
D3427621
fbshipit-source-id:
534276ba1e0ade185e3af0665f419f3c51d3f980
Joseph Griego [Tue, 14 Jun 2016 00:49:38 +0000 (17:49 -0700)]
EventBase keepAlive counter is not atomic
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
Michael Lee [Tue, 14 Jun 2016 00:05:24 +0000 (17:05 -0700)]
Time.h portability for iOS 10.
Summary: The iOS sdk adds `clock_gettime` support.
Reviewed By: clementgenzmer
Differential Revision:
D3427621
fbshipit-source-id:
fcd3022c5ea05ceb8e289fbeb1ae845155d2dea9
Alexey Spiridonov [Sat, 11 Jun 2016 02:12:36 +0000 (19:12 -0700)]
DCHECK on reentrant invocations of loop()
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
Ben Hamilton [Fri, 10 Jun 2016 23:01:34 +0000 (16:01 -0700)]
Make Fibers library conditional on working Boost.Context fcontext_t
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
Andrii Grynenko [Fri, 10 Jun 2016 22:25:44 +0000 (15:25 -0700)]
Fix folly::fibers on OSX with boost 1.60
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
Maged Michael [Fri, 10 Jun 2016 15:53:32 +0000 (08:53 -0700)]
Added support for std::mutex in folly Deterministic Schedule
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
Marcus Holland-Moritz [Fri, 10 Jun 2016 06:40:54 +0000 (23:40 -0700)]
Get rid of circular dependency when including ExceptionWrapper.h from Conv.h
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
Christopher Dykes [Thu, 9 Jun 2016 23:01:25 +0000 (16:01 -0700)]
Use intrinsics rather than inline assembly where possible
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
Chad Parry [Thu, 9 Jun 2016 22:07:58 +0000 (15:07 -0700)]
Allow a timer with pending callbacks to be destroyed
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
pravic [Thu, 9 Jun 2016 22:01:51 +0000 (15:01 -0700)]
Fix typo in docs/Function.md
Summary: Closes https://github.com/facebook/folly/pull/421
Reviewed By: yfeldblum
Differential Revision:
D3413832
Pulled By: elliottneilclark
fbshipit-source-id:
7af1462c250c8d6b5d6f5dfcb3f3117dff7877c9
Martin Martin [Thu, 9 Jun 2016 18:53:14 +0000 (11:53 -0700)]
Fix a data race found by TSAN in folly::fibers::Baton
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
David Callahan [Thu, 9 Jun 2016 01:31:19 +0000 (18:31 -0700)]
fix command line parsing
Summary: parse command line flags to pick up -json flag
Reviewed By: mzlee
Differential Revision:
D3405794
fbshipit-source-id:
e2d216c74f04c15d7470c70abfc2bd25c2ceda98
Brett Simmers [Thu, 9 Jun 2016 00:19:20 +0000 (17:19 -0700)]
Allow const mapped types in folly::AtomicHash(Array|Map)
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
Adam Simpkins [Wed, 8 Jun 2016 23:15:18 +0000 (16:15 -0700)]
make Range::size() constexpr
Summary:
Declare size() to return a constexpr value, so it can be called on constexpr
Range objects.
This unfortunately does drop the existing assert() check, due to a gcc bug:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71448
Reviewed By: lbrandy
Differential Revision:
D3394612
fbshipit-source-id:
77ea3b961dc323a39dea6f0e5850f9a311210d09
Christopher Dykes [Wed, 8 Jun 2016 19:51:28 +0000 (12:51 -0700)]
Pack PackedSyncPtr
Summary: The comment was right about the packed attribute not liking private members, so pack `PackedSyncPtr` to get GCC to pack structs containing it correctly.
Reviewed By: yfeldblum
Differential Revision:
D3402936
fbshipit-source-id:
11d9def132d5dedf04b0e263c379cac339a52fa3
Adam Simpkins [Wed, 8 Jun 2016 19:49:45 +0000 (12:49 -0700)]
add hexlify() and unhexlify() convenience methods
Summary:
Add new versions of hexlify() and unhexlify() that directly return a
std::string, similar to the helper functions that already exist for humanify()
and backslashify().
The function signatures for these helpers are different than the humanify() and
backslashify() helpers--these functions always accept StringPiece or ByteRange
arguments. This allows them to easily accept "const char*" arguments, without
having to convert the arguments to a std::string. (I think we probably should
fix the humanify() and backslashify() helpers to be similar in a separate
diff.)
Reviewed By: yfeldblum
Differential Revision:
D3403863
fbshipit-source-id:
a2df49d5857e1d34caac3d78283dc293f4ef1ab6
Andrii Grynenko [Wed, 8 Jun 2016 01:30:18 +0000 (18:30 -0700)]
Disable SIGSEGV signal handler if run in JVM
Reviewed By: ldemailly
Differential Revision:
D3402550
fbshipit-source-id:
3de47c569868545c3861dab9a7b244ed8fb1fadf
Adam Radziwonczyk-Syta [Tue, 7 Jun 2016 19:59:48 +0000 (12:59 -0700)]
Expose current observer from FiberManager
Summary:
Inteded use case is to write tracing code in common components that can adjust its behavior to the current observer. E.g.
auto* observer = FiberManager::getUnsafe()->getObserver();
if (auto* specific_observer = dynamic_cast<SpecificObserver*>(observer)) {
specific_observer->set_fiber_name(...);
}
Reviewed By: andriigrynenko
Differential Revision:
D3392890
fbshipit-source-id:
284b4964bbb17e9a081779b870af68e8f1a81634
Subodh Iyengar [Tue, 7 Jun 2016 14:43:37 +0000 (07:43 -0700)]
Add TFO support to AsyncSSLSocket
Summary:
This adds TFO support to AsyncSSLSocket which
uses the support for TFO from AsyncSocket.
Because of the way AsyncSSLSocket inherits from
AsyncSocket it is tricky.
The following changes were made:
1. Openssl internally will treat only errors with return
code -1 as READ_REQUIRED or WRITE_REQUIRED errors. So this
diff changes the return value of the errors in the TFO fallback
cases to -1.
2. In case we fallback after SSL_connect() to a normal connect,
we would have to restart the connection process after connect
succeeds. To do this this overrides the connection success callback
and restarts the connection before sending the callback to AsyncSocket
because sometimes callbacks might synchronously call sslConn() in the
normal connect cases.
3. Delegated bioWrite to call sendSocketMessage instead of sendmsg directly.
Reviewed By: djwatson
Differential Revision:
D3391735
fbshipit-source-id:
61434f6de4a9c3d03973c9ab9e51eb49e751e5cf
Kenny Yu [Mon, 6 Jun 2016 23:20:39 +0000 (16:20 -0700)]
folly: define FOLLY_SANITIZE_THREAD convenience macro for TSAN
Summary:
This defines the macro `FOLLY_SANITIZE_THREAD`, similar to `FOLLY_SANITIZE_ADDRESS`.
Note that gcc *just* landed support for the `__SANITIZE_THREAD__` macro two weeks
ago: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64354
Reviewed By: igorsugak
Differential Revision:
D3389021
fbshipit-source-id:
df6497a7741657c297ee812ed07cbae102b6810d
Christopher Dykes [Sat, 4 Jun 2016 00:43:42 +0000 (17:43 -0700)]
Allow constexpr construction of AtomicStruct under MSVC
Summary: Attempting to use this under MSVC, as `MemoryIdler::defaultIdleTimeout` does, generated warnings about the symbol being dynamically initialized due to an implementation limation. Solve this by defining a union instead of calling `encode` in the constructor.
Reviewed By: yfeldblum
Differential Revision:
D3387916
fbshipit-source-id:
b0d628b6d086960e94121b6183a31348fb151aac
Christopher Dykes [Sat, 4 Jun 2016 00:43:13 +0000 (17:43 -0700)]
Deal with a couple of warnings from MSVC
Summary: MSVC is warning that `client` may be uninitialized, which is possible if the callback doesn't actually set them for some reason. Solve that by explicitly initializing it to `nullptr`. Also deal with the warning about the initialization of `dynamic::array` using braced syntax by not using that syntax.
Reviewed By: yfeldblum
Differential Revision:
D3387782
fbshipit-source-id:
e4d25ad32e99a73d7d062be9a2f2b5bde5d17396
Christopher Dykes [Sat, 4 Jun 2016 00:42:35 +0000 (17:42 -0700)]
Remove a couple of MSVC portability defines
Summary: The first is both wrong (due to the difference in semantics) and unneeded, as MSVC 2015 supports `snprintf` natively and with the correct semantics. The second is simply never used.
Reviewed By: yfeldblum
Differential Revision:
D3387551
fbshipit-source-id:
ea666a60ce859a59ad3d3ff961b4d7d642fd86eb
Andrii Grynenko [Fri, 3 Jun 2016 22:01:28 +0000 (15:01 -0700)]
Add a SIGSEGV signal handler which detects stack overflow
Summary: GuardPageAllocator now keeps a track of all protected pages. If SIGSEGV occurs, signal handler can check address at fault against protected pages and if it matches - we got a fiber stack overflow.
Reviewed By: yfeldblum
Differential Revision:
D3386960
fbshipit-source-id:
775b36ee08fecbbd87da0025f794717c222f5cce
Subodh Iyengar [Fri, 3 Jun 2016 19:40:37 +0000 (12:40 -0700)]
Always override write bio method
Summary:
Always overriding write bio method
allows us to more cleanly implement
features like eor tracking, support
multiple ssl libraries, and also TFO
Reviewed By: anirudhvr
Differential Revision:
D3350482
fbshipit-source-id:
ddd2333431f9d636d69c8325b2c18d7cc043b848
Elliott Clark [Thu, 2 Jun 2016 22:37:35 +0000 (15:37 -0700)]
Update folly OSS build to use 1y
Summary: use std=c++1y for compiling since we use c+=14 feautures but don't want to require a recent gcc.
Reviewed By: bhamiltoncx
Differential Revision:
D3380287
fbshipit-source-id:
8ece6007cf613d307bafe692f1af70f5359df95a
Christopher Dykes [Wed, 1 Jun 2016 22:36:26 +0000 (15:36 -0700)]
Assert that MicroSpinLock is a POD type
Summary: Because if it's not, all hell will break lose (apparently).
Reviewed By: meyering
Differential Revision:
D3373061
fbshipit-source-id:
f08a863d1bacadeeff9d9cea041f399f136cfc74
Christopher Dykes [Wed, 1 Jun 2016 22:34:02 +0000 (15:34 -0700)]
PackedSyncPtr.data_ is private
Summary: As the (now removed) comment says, GCC 4.6 doesn't treat structs with private members as POD types... The thing is, GCC 4.6 is long dead, so make `data_` private and assert that it's a POD type.
Reviewed By: meyering
Differential Revision:
D3373172
fbshipit-source-id:
b2f1ee59d544461fe986705164cc6c866af62865
Ben Hamilton [Wed, 1 Jun 2016 17:43:50 +0000 (10:43 -0700)]
Fix test/SynchronizedTest.cpp build break on Clang on OS X
Summary:
The Folly `make check` build is broken with Clang on OS X.
This diff fixes the following break in `test/SynchronizedTest.cpp`:
SynchronizedTest.cpp:150:10: error: thread-local storage is not supported for the current target
static thread_local int lockCount_;
The problem is clang on OS X doesn't support the `thread_local` extension:
http://stackoverflow.com/a/
29929949
so we now use the `FOLLY_TLS` compatibility macro.
When I fixed this, I found the test also failed to compile if `FOLLY_SYNCHRONIZED_HAVE_TIMED_MUTEXES` was `#define`d to `0` (as it is on OS X), so I fixed that.
Reviewed By: mzlee
Differential Revision:
D3361215
fbshipit-source-id:
e93be6872bcab03090448b9421e502e472f149ff
Christopher Dykes [Wed, 1 Jun 2016 17:14:26 +0000 (10:14 -0700)]
SingletonVault_c.cpp is always C++
Summary: It's simply not possible to compile the C++ side of the C API as C, so don't guard the `extern "C"` as if it is.
Reviewed By: meyering, yfeldblum
Differential Revision:
D3369474
fbshipit-source-id:
d3316704ce17a471bc9d6a3a235472bf40cedb9d
Subodh Iyengar [Wed, 1 Jun 2016 08:45:00 +0000 (01:45 -0700)]
Methods to change cipher suite list
Summary: Add methods to change cipher suite list and sigalg list
Reviewed By: anirudhvr
Differential Revision:
D3295935
fbshipit-source-id:
eb46311986465e399eafa69e3070b53b36bce820
Michael Lee [Tue, 31 May 2016 18:24:56 +0000 (11:24 -0700)]
SocketFastOpen should include <cerrno>
Summary: Include cerrno to define `EOPNOTSUPP` and `ENOPROTOOPT`.
Reviewed By: elindsey
Differential Revision:
D3366479
fbshipit-source-id:
3a93a1c247ffa4a9d4ea03577713362a2a35c8b7
Michael Lee [Tue, 31 May 2016 16:31:41 +0000 (09:31 -0700)]
SubprocessTest does not use dirent.h
Summary: Remove it as we do not need it here.
Reviewed By: yfeldblum
Differential Revision:
D3365991
fbshipit-source-id:
bb36caca0319df4c8d6e3d978045b7c28369f043
Subodh Iyengar [Tue, 31 May 2016 04:08:33 +0000 (21:08 -0700)]
Add support for TFO connections
Summary:
This adds support to establish connections
over TFO.
The API introduced here retains the same
connect() + write() api that clients currently
use.
If enableTFO() is called then the connect will
be deferred to the first write. This only works
with request response protocols since a write
must trigger the connect. There is a tradeoff here
for the simpler API, and we can address this with
other signals such as a short timeout in the future.
Even though the client might enable TFO, the program
might run on machines without TFO support.
There were 2 choices for supporting machines where
TFO might not be enabled:
1. Fallback to normal connect if tfo sendmsg fails
2. Check tfo supported on the machine before using it
Both these have their tradeoffs, however option 1 does
not require us to read from procfs in the common code
path.
Reviewed By: Orvid
Differential Revision:
D3327480
fbshipit-source-id:
9ac3a0c7ad2d206b158fdc305641fedbd93aa44d
Christopher Dykes [Mon, 30 May 2016 23:05:21 +0000 (16:05 -0700)]
Switch uses of networking headers to <folly/portability/Sockets.h>
Summary:
Diff #14 of 14.
This just switches the includes of the headers, it does not make the adjustments actually required to work for MSVC.
Reviewed By: mzlee
Differential Revision:
D3249009
fbshipit-source-id:
434f58a7b8f4d0b7d142bc6a4abed8d95c953a7f
Christopher Dykes [Mon, 30 May 2016 23:05:20 +0000 (16:05 -0700)]
Switch uses of <sys/uio.h> to <folly/portability/SysUio.h>
Summary: Diff #13 of 14.
Reviewed By: mzlee
Differential Revision:
D3116264
fbshipit-source-id:
80e498b7062f40d723e156901bf62a2101a6e6ba
Christopher Dykes [Mon, 30 May 2016 23:05:19 +0000 (16:05 -0700)]
Switch uses of <unistd.h> to <folly/portability/Unistd.h>
Summary: Diff #12 of 14.
Reviewed By: mzlee
Differential Revision:
D3187000
fbshipit-source-id:
ad56ca8ff20fa88949554b61545ee1bf982b0569
Christopher Dykes [Mon, 30 May 2016 23:05:18 +0000 (16:05 -0700)]
Include <folly/portability/PThread.h> where needed
Summary: Diff #11 of 14.
Reviewed By: mzlee
Differential Revision:
D3262478
fbshipit-source-id:
d06eee44d1ccefc78a381e44c400c0242b5e0e5a
Christopher Dykes [Mon, 30 May 2016 23:05:17 +0000 (16:05 -0700)]
Include <folly/portability/Time.h> where needed
Summary: Diff #10 of 14
Reviewed By: mzlee
Differential Revision:
D3270909
fbshipit-source-id:
2c644ca5db4ecf0387b167d2f6ecc62ddf687a56
Christopher Dykes [Mon, 30 May 2016 23:05:16 +0000 (16:05 -0700)]
Include <folly/portability/Fcntl.h> where needed
Summary: Diff #9 of 14.
Reviewed By: mzlee
Differential Revision:
D3262436
fbshipit-source-id:
60c5df03e91163c651bc6e5e0d38ba8b46b8c723
Christopher Dykes [Mon, 30 May 2016 23:05:15 +0000 (16:05 -0700)]
Switch uses of <sys/syscall.h> to <folly/portability/SysSyscall.h>
Summary: Diff #8 of 14.
Reviewed By: mzlee
Differential Revision:
D3186943
fbshipit-source-id:
3b631faac36f3ec6e7fce031f07d8a98c76d7908
Christopher Dykes [Mon, 30 May 2016 23:05:13 +0000 (16:05 -0700)]
Switch uses of <dirent.h> to <folly/portability/Dirent.h>
Summary: Diff #5 of 14.
Reviewed By: mzlee
Differential Revision:
D3186885
fbshipit-source-id:
1947656137cad62a019cdf687cff9913bcecde2a
Christopher Dykes [Mon, 30 May 2016 23:05:12 +0000 (16:05 -0700)]
Switch uses of <sys/resource.h> to <folly/portability/SysResource.h>
Summary: Diff #4 of 14.
Reviewed By: mzlee
Differential Revision:
D3181101
fbshipit-source-id:
d0db67ae19ee71e6a251c299ef672baead3ab9d9
Christopher Dykes [Mon, 30 May 2016 23:05:11 +0000 (16:05 -0700)]
Switch uses of <sys/mman.h> to <folly/portability/SysMman.h>
Summary: Diff #3 of 14.
Reviewed By: mzlee
Differential Revision:
D3110299
fbshipit-source-id:
39e4980df14b0b108b20dbbe57f2c5c6b361ea2e
Christopher Dykes [Mon, 30 May 2016 23:05:10 +0000 (16:05 -0700)]
Switch uses of <sys/file.h> to <folly/portability/SysFile.h>
Summary: Diff #2 of 14.
Reviewed By: mzlee
Differential Revision:
D3115972
fbshipit-source-id:
c75cbc95f37e8f2c2bf81311a8ca08ee766fc107
Christopher Dykes [Mon, 30 May 2016 23:05:07 +0000 (16:05 -0700)]
Include <folly/portability/SysTime.h> rather than <sys/time.h>
Summary:
This changes includes of `<sys/time.h>` to `<folly/portability/SysTime.h>`.
The ultimate goal of all of this is to get HHVM compiling on Windows with MSVC 2015. At the moment there are no plans to support MCRouter, Squangle, or AFDT under Windows. There are also no current plans to support MinGW or Cygwin.
Now, on to the headers themselves. There are three primary kinds of portability headers.
- Replacement headers. These are headers such as `<sys/time.h>` that MSVC simply does not have. These headers should always be included instead of the headers they are replacing.
- Additive headers. These are headers, such as `<time.h>` that MSVC has, but are either missing functions, or has the functions but under a different name. The portability headers for these only needs to be included instead of the original header if you are using a function that MSVC does not have. The reason for this is that forcing the use of the portability header for `<stdlib.h>` just because MSVC doesn't have `mkdtemp` and `realpath` would just be messy.
- Utility headers. These are portability headers, such as `Memory.h` that exist to provide a portable interface to various things, in this case the allocation and freeing of aligned memory. They are not implementing any existing API, and all contents are in the `folly` namespace.
The API's implemented in the first and second types of headers are intended as drop-in replacements for the Linux versions, however they only implement the functions and features that are actually needed, and are not intended as feature-complete replacements. They are not intended for use outside of Facebook projects. Any API's expecting text input expect them to be in the same encoding as the Posix API's define, in most cases that means UTF-8. Anywhere in the portability headers that fails to account for this is a bug, and should be pointed out in the diff (if it's still in review), or else by filing a task detailing the issue and assigning it to me.
For all headers, if there is a mechanism in C++11, or else in Folly itself, that allows the same functionality, that mechanism should be used instead of adding a function to the portability headers.
Reviewed By: swtaarrs, yfeldblum
Differential Revision:
D3095643
fbshipit-source-id:
3a5c0029f95b03ea320725df88e14a67ca38a445
Adam Simpkins [Sat, 28 May 2016 00:48:14 +0000 (17:48 -0700)]
add Cursor::readWhile() and skipWhile()
Summary:
Add generic functions for reading or skipping until a predicate check fails.
This will allow us to simplify a few different call sites that have their own
logic similar to this. Also change readTerminatedString() to use
readWhile().
Reviewed By: alandau
Differential Revision:
D3337581
fbshipit-source-id:
9f50914c83adfc882219046862972661bed0e72a
Ben Hamilton [Sat, 28 May 2016 00:01:53 +0000 (17:01 -0700)]
Fix test/ProducerConsumerQueueTest.cpp build break
Summary:
The Folly `make check` build is broken with Clang on OS X.
This diff fixes the following break in `test/ProducerConsumerQueueTest.cpp`:
In file included from ProducerConsumerQueueTest.cpp:17:
../../folly/ProducerConsumerQueue.h:55:18: error: no member named 'bad_alloc' in namespace 'std'
throw std::bad_alloc();
The problem is a missing `#include <memory>` in `folly/ProducerConsumerQueue.h`.
Reviewed By: djwatson
Differential Revision:
D3361252
fbshipit-source-id:
d740914f54ede5617abc16437ab2e20a7376f6e5
Ben Hamilton [Sat, 28 May 2016 00:00:50 +0000 (17:00 -0700)]
Fix test/FunctionTest.cpp build breaks
Summary:
The Folly `make check` build is broken with Clang on OS X.
This diff fixes two breaks in `test/FunctionTest.cpp`:
1. `FunctionTest.cpp:39:20: error: implicit instantiation of undefined template 'std::__1::array<int, 100>'`
2. `FunctionTest.cpp:103:3: error: no matching conversion for functional-style cast from 'Function<int (int)>' to '::testing::AssertionResult'`
The first was a missing `#include <array>`, and the second is a workaround for this gtest bug:
https://github.com/google/googletest/issues/429
Reviewed By: djwatson
Differential Revision:
D3361188
fbshipit-source-id:
8140de978a2cbaf0f4aab45781ce0d656f03202b
Ben Hamilton [Fri, 27 May 2016 23:12:47 +0000 (16:12 -0700)]
Fix open source `make check` build broken by `ThreadedExecutorTest.cpp` moving to `wangle`
Summary:
The Folly `make check` build is broken with Clang on OS X.
This diff fixes the following break in `make check`:
make[3]: *** No rule to make target `../futures/test/ThreadedExecutorTest.cpp', needed by `../futures/test/ThreadedExecutorTest.o'. Stop.
The problem is a reference to a file which was moved to `wangle` in
D3286988.
Reviewed By: simpkins
Differential Revision:
D3361287
fbshipit-source-id:
a9ae794374982b4accf806bd9608988430c75cfd
Yang Chi [Fri, 27 May 2016 22:33:40 +0000 (15:33 -0700)]
Set bufferCallback_ back to nullptr upon HTTPSession shutdown
Summary: AsyncSocket::handleWrite may trigger HTTPSession::onWriteSuccess which may totally delete the HTTPSession. AsyncSocket::handleWrite also calls bufferCallback_->onEgressBufferCleared(). That bufferCallback_ is the HTTPSession. So in this diff resets bufferCallback_ to nullptr upon HTTPSession shutdown. afrind had a suggestion of adding a DestructorGuard in AsyncSocket::handleWrite. But i don't know DestructorGuard that well. I think it will keep AsyncSocket from being deleted but not the HTTPSession? Or maybe I can DestructorGuard dg(bufferCallback_) ?
Reviewed By: afrind
Differential Revision:
D3311058
fbshipit-source-id:
cdb5fcbd53837a3effbc096eab87fca4e5d17291
Subodh Iyengar [Fri, 27 May 2016 17:36:48 +0000 (10:36 -0700)]
Fix test for corking
Summary:
Min rto is now 50ms, so change the
test accordingly
Reviewed By: w-o-o
Differential Revision:
D3357140
fbshipit-source-id:
5a807fabc1a3c216a5120b8eb4930e5c1eb52b7a
Giuseppe Ottaviano [Fri, 27 May 2016 16:49:40 +0000 (09:49 -0700)]
Use exponential growth in fbstring::append(size_type n, value_type c)
Summary:
Contrary to the other `append` flavors, `fbstring::append(size_type n, value_type c)`
does not use exponential growth, which can trigger quadratic behavior.
Reviewed By: philippv
Differential Revision:
D3357315
fbshipit-source-id:
2301ed1a9953544368663107113890a25c6621ae
Christopher Dykes [Fri, 27 May 2016 16:48:20 +0000 (09:48 -0700)]
Disable a couple of warnings for MSVC in folly::Function
Summary:
MSVC generates warnings if you define multiple assignment operators or multiple copy constructors on the same type. This is deliberate in `folly::Function`, so just disable the warnings for the struct instead.
Note that the warnings have to be disabled for the entire struct for them to actually be disabled. Disabling them just around the declarations of the constructors and operators in question does not actually disable the warnings.
Reviewed By: yfeldblum
Differential Revision:
D3347746
fbshipit-source-id:
abb53a1e62bcfb7ce02759a7ce8637d824a82081
Adam Simpkins [Thu, 26 May 2016 22:38:13 +0000 (15:38 -0700)]
move io/Cursor-defs.h to io/Cursor.cpp
Summary:
The two function definitions in this file are both normal function definitions,
not template functions. Therefore this should be just a normal .cpp file, and
not a -defs.h header file.
Reviewed By: igorsugak
Differential Revision:
D3348439
fbshipit-source-id:
3ebe49c84493f5aab06c568d9df15a37c2c48836
Adam Simpkins [Thu, 26 May 2016 19:50:38 +0000 (12:50 -0700)]
add a default Subprocess constructor
Summary:
The default constructor creates the Subprocess in an uninitialized state. This
makes it possible to default-construct a Subprocess, but only initialize it
later using the move assignment operator.
Even before this diff, it was possible to have Subprocess objects in
uninitialized states after using the move assignment operator to move the data
out of a Subprocess object.
Reviewed By: yfeldblum
Differential Revision:
D3348490
fbshipit-source-id:
aa6acef9be770de8f0ee118da294cb134f04a466
Christopher Dykes [Thu, 26 May 2016 19:25:43 +0000 (12:25 -0700)]
Disable the signal stack on Windows
Summary: There is no equivalent functionality for Windows, so disable it completely.
Reviewed By: andriigrynenko
Differential Revision:
D3348481
fbshipit-source-id:
52a104f5a8013113f54d5b10c2f0f9b720eeb4f6
Christopher Dykes [Thu, 26 May 2016 17:10:47 +0000 (10:10 -0700)]
Remove the declaration of TimeseriesHistogram::getBucketIdx
Summary: Because, as MSVC rightly tells us, it's not actually defined anywhere.
Reviewed By: yfeldblum
Differential Revision:
D3347654
fbshipit-source-id:
2162bc745136ee0129caa4de78f38e1361083cd1
Christopher Dykes [Thu, 26 May 2016 17:08:57 +0000 (10:08 -0700)]
Include <folly/portability/Windows.h> in folly::format
Summary:
Because apparently I didn't actually add the `Windows.h` include when I added support for MSVC.
This is safe for all platforms because the portability header only includes `Windows.h` when compiling on Windows.
Reviewed By: yfeldblum
Differential Revision:
D3347785
fbshipit-source-id:
4f3e4e6c11953e2588b6fed287324a92e3ef8873
Christopher Dykes [Thu, 26 May 2016 17:08:13 +0000 (10:08 -0700)]
Fix doVecOperation in the SysUio portability header
Summary: Apparently I failed to accurately transfer this particular change to fbcode, which meant it didn't actually compile on Windows.
Reviewed By: yfeldblum
Differential Revision:
D3347976
fbshipit-source-id:
775682f10ab68672f6463ccc69a222ae0a52a097
Adam Simpkins [Wed, 25 May 2016 19:07:07 +0000 (12:07 -0700)]
add Cursor::peekBytes()
Summary:
The existing Cursor::peek() method pre-dates the existence of folly::ByteRange,
and so it returns a std::pair containing a pointer and length. This is usually
more awkward to use than ByteRange.
This adds a peekBytes() method that returns a ByteRange object, and updates all
users of peek() in folly to use peekBytes() instead. Eventually I think we
should add a FOLLY_DEPRECATED attribute to peek(). I will wait to add this tag
until after converting a few other projects to use peekBytes(), though.
Reviewed By: alandau
Differential Revision:
D3337302
fbshipit-source-id:
14220a059d915bf5adc66b8b283f7228b796a4dc
Jon Maltiel Swenson [Tue, 24 May 2016 22:41:25 +0000 (15:41 -0700)]
std::make_unique -> folly::make_unique
Summary:
We should use folly::make_unique instead of std::make_unique in order to support
compilers without support for C++14.
Reviewed By: pavlo-fb
Differential Revision:
D3343288
fbshipit-source-id:
9150af752e57988962a7580851ffa32086c669d7
Christopher Dykes [Tue, 24 May 2016 20:57:25 +0000 (13:57 -0700)]
Update generate_varint_tables to support MSVC
Summary: MSVC is a massive pain in this respect, and, after testing many workarounds, and only ending up with it just emitting a dynamic initializer for them, it's easier to just generate the table as a `uint64_t` and load it explicitly.
Reviewed By: yfeldblum
Differential Revision:
D3270226
fbshipit-source-id:
77bc84e58d393373de05a28a30dcb80b66c09c9f
Joseph Griego [Tue, 24 May 2016 20:14:54 +0000 (13:14 -0700)]
Clear old fs::path when moving a TemporaryDirectory
Summary:
If a TemporaryDirectory with scope DELETE_ON_DESTRUCTION gets moved
and then goes out of scope, the directory will be deleted while the moved
object still holds that path; we just clear the path from the old object to
prevent this
Reviewed By: yfeldblum
Differential Revision:
D3331079
fbshipit-source-id:
9c99413661e2436ccec937d3fa652da810133b34
Chad Parry [Tue, 24 May 2016 18:05:14 +0000 (11:05 -0700)]
Switch HHWheelTimer::SharedPtr to a standard shared pointer
Summary:
As part of my campaign to get `HHWheelTimer` away from intrusive ref-counting semantics, (cf.
D3237530), I am redefining `HHWheelTimer::SharedPtr`. It is now a true `std::shared_ptr`. This will break clients that attempt the following:
HHWheelTimer::UniquePtr timer1{HHWheelTimer::newTimer()};
HHWheelTimer::SharedPtr timer2{timer1};
In the past, that code would compile, because `timer2` could use the intrusive ref-counting, and `timer1` would still be valid. After this change, the second timer would need to be initialized with `std::move(timer1)` instead. The `UniquePtr` is starting to actually be unique.
There is only one place in the code that actually tries to do such a copy. It's in a test, which I have changed. Any other instances of that behavior would create a compilation error, so it's impossible for one to be overlooked.
Reviewed By: djwatson
Differential Revision:
D3337038
fbshipit-source-id:
085e4da41c9a142d253a1ac0b1dd0fc508dff704
Christopher Dykes [Tue, 24 May 2016 00:30:29 +0000 (17:30 -0700)]
Support folly::assume under MSVC
Summary: Actually __assume when we assume.
Reviewed By: meyering
Differential Revision:
D3336033
fbshipit-source-id:
6c931e9f832dd1d861d03e3ad8e308f612522401
Yedidya Feldblum [Mon, 23 May 2016 06:35:19 +0000 (23:35 -0700)]
Avoid std::initializer_list ctor in folly::dynamic::array
Summary:
[Folly] Avoid `std::initializer_list` ctor in `folly::dynamic::array`.
This will help deprecate the dangerous initializer-list constructor. The init-list construction is dangerous because its semantics vary by compiler and by compiler version.
Reviewed By: ot
Differential Revision:
D3333148
fbshipit-source-id:
031e7593b7e28b299d5eeeb5ce7aed9216dd3a5c
Andrii Grynenko [Fri, 20 May 2016 22:55:24 +0000 (15:55 -0700)]
Make outstanding LoopKeepAlive hold EventBase destructor
Summary:
LoopKeepAlive handle can be grabbed to signal that some external event will later be scheduled on the EventBase via runInEventBaseThread. Usually the code which will be calling runInEventBaseThread only has a raw pointer to an EventBase, so it doesn't have any way to know it was destroyed.
This change ensures that EventBase destructor will keep running the event loop until all such LoopKeepAlive handles are released.
Reviewed By: yfeldblum
Differential Revision:
D3323835
fbshipit-source-id:
4071dae691a61dfebe2f1759cf99f661b161fa4a
Christopher Dykes [Fri, 20 May 2016 21:26:38 +0000 (14:26 -0700)]
Fix the detection of preadv and pwritev on OSX in OSS
Summary:
The configure script doesn't define `FOLLY_HAVE_PREADV` if `preadv` isn't supported, so these checks were wrong. Undefined defines expand to `0`, so this is safe.
Fixes https://github.com/facebook/folly/issues/412
Reviewed By: mzlee, yfeldblum
Differential Revision:
D3329405
fbshipit-source-id:
faee8951c68d4c67e06e7720dfc142e63a9dbd9f
Shubhanshu Agrawal [Fri, 20 May 2016 05:03:16 +0000 (22:03 -0700)]
templating folly::fibers::await by Baton
Summary:
This diff templates folly::fibers::await by Baton.
This would be helpful in passing in custom BatonType's, which is needed for
D3007734
Depends on:
D3314891
Reviewed By: andriigrynenko
Differential Revision:
D3314925
fbshipit-source-id:
9052dc503b9509f16cd41b5e3ede0479a98067aa
Alejandro [Thu, 19 May 2016 16:19:54 +0000 (09:19 -0700)]
Promote memory_order_consume to memory_order_acquire
Summary:
The current use case of `std::memory_order_consume` in this project was intended to provide the appropriate synchronization in cases where a consumer spins on `while( spsc_queue.empty() ) {} `, and then attempts to use an element of the queue since the loop was broken out of, according to comments [here](https://reviews.facebook.net/D48141). Consume semantics do not provide this guarantee according to the standard since there is no data dependency from the producer that can be carried to the consumer by doing a load-consume from the corresponding functions. What is needed is a load-acquire. Current compilers promote `memory_order_consume` to `memory_order_acquire`. Thus, this example appears to work simply due to the promotion from consume to acquire, but would fail to generate the right synchronization instructions on weaker architectures once `memory_order_consume` is implemented as intended. Therefore, the `memory_order` should be tightened to `memory_order_acquire` to guarantee visibility to the consumer
Closes https://github.com/facebook/folly/pull/381
Reviewed By: djwatson
Differential Revision:
D3173574
Pulled By: nbronson
fbshipit-source-id:
b109be2e74f016750a3fe1f848e3fc66e609b9d2
Yedidya Feldblum [Thu, 19 May 2016 09:20:24 +0000 (02:20 -0700)]
Extract Try to top-level
Summary:
[Folly] Extract `Try` to top-level.
It was in `folly/futures/`, but this diff moves it to `folly/`.
It is needed for futures, but it is are more general than futures and can be used separately.
Use `folly/Try.h` instead of `folly/futures/Try.h`.
Also fixes up all `#include` sites:
hg grep -lw folly/futures/Try | xargs perl -pi -e 's,\bfolly/futures/Try\b,folly/Try,g'
Reviewed By: markisaa
Differential Revision:
D3309908
fbshipit-source-id:
cdf13f0ac0b0e36aa07e0f1d04870d06500c5874
Lucian Grijincu [Thu, 19 May 2016 08:14:49 +0000 (01:14 -0700)]
folly: FBString: avoid ubsan in assert
Summary:
```
buck-out/gen/folly/__default_headers__#default,headers/folly/FBString.h:365:7: runtime error: null pointer passed as argument 2, which is declared to never be null
third-party-buck/build/glibc/include/string.h:70:33: note: nonnull attribute specified here
#0 0x433a39 in _ZZN5folly13fbstring_coreIcEC1EPKcmbENKUlvE_clEv ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////buck-out/gen/folly/__default_headers__#default,headers/folly/FBString.h:365:7
#1 0x4335a9 in _ZN5folly14ScopeGuardImplIZNS_13fbstring_coreIcEC1EPKcmbEUlvE_E7executeEv ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////buck-out/gen/folly/__default_headers__#default,headers/folly/ScopeGuard.h:153:29
#2 0x4335a9 in _ZN5folly14ScopeGuardImplIZNS_13fbstring_coreIcEC1EPKcmbEUlvE_ED2Ev ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////buck-out/gen/folly/__default_headers__#default,headers/folly/ScopeGuard.h:130
#3 0x4335a9 in folly::fbstring_core<char>::fbstring_core(char const*, unsigned long, bool) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////buck-out/gen/folly/__default_headers__#default,headers/folly/FBString.h:427
#4 0x4353fa in folly::basic_fbstring<char, std::char_traits<char>, std::allocator<char>, folly::fbstring_core<char> >::basic_fbstring(char const*, unsigned long, std::allocator<char> const&) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////buck-out/gen/folly/__default_headers__#default,headers/folly/FBString.h:1038:9
```
Reviewed By: Gownta
Differential Revision:
D3321266
fbshipit-source-id:
28d5aef16e91a98066a1de6bab95403fbc63eaab
Andrii Grynenko [Thu, 19 May 2016 05:57:40 +0000 (22:57 -0700)]
Move fibers out of experimental
Summary: folly::fibers have been used by mcrouter for more than 2 years, so not really experimental.
Reviewed By: pavlo-fb
Differential Revision:
D3320595
fbshipit-source-id:
68188f92b71a4206d57222993848521ca5437ef5
Shubhanshu Agrawal [Thu, 19 May 2016 03:42:24 +0000 (20:42 -0700)]
adding Promise::await
Summary:
This diff adds a static await method to Promise.
Also after this, folly::fibers::await is just a wrapper around Promise::await.
This also removes the friend relationship between Promise and await.
This would be helpful in making the folly::fibers::await templated by Baton changes easier to make.
Reviewed By: andriigrynenko
Differential Revision:
D3314891
fbshipit-source-id:
361546c078caafd067734d2f474c617d7fb888b0