5 years agoPrevent a crash in folly::Symbolizer
Mark Williams [Mon, 20 Feb 2017 22:53:22 +0000 (14:53 -0800)]
Prevent a crash in folly::Symbolizer

dbg and dbgo builds of hhvm with gcc-5 crash when generating
backtraces using folly::Symbolizer, because the .debug_aranges for are SHF_COMPRESSED, and folly::Symbolizer doesn't
recognize that.

Just pretend that the section doesn't exist if it has SHF_COMPRESSED

We might eventually want to support decompressing such sections under
an option - but folly::Symbolizer's goal is to just mmap and walk the
debug info without allocating memory (so that it can run while
handling signals etc).

Reviewed By: pixelb

Differential Revision: D4586762

fbshipit-source-id: bef61ed670d1a80caa4f7aac1f80fd2a92cc4ba9

5 years agoAdd Baton variants with multiple posters and with a non-blocking waiter
Maged Michael [Fri, 17 Feb 2017 13:13:28 +0000 (05:13 -0800)]
Add Baton variants with multiple posters and with a non-blocking waiter

Added two variants of Baton by adding two Boolean template parameters with defaults that correspond to the original single poster blocking waiter version:
- SinglePoster (single poster vs multiple posters). Default true.
- Blocking (vs spinning). Default true.

The multi-poster baton (SinglePoster = false) can be handed over by multiple concurrent posters, where redundant post()-s are idempotent but if a post() arrives after the baton is reset() then it unblocks the waiter.

The nonblocking Baton (Blocking = false) has faster common case post(), by avoiding CAS in the critical path. It does so by disallowing waiter blocking and timed_wait().

Reviewed By: nbronson

Differential Revision: D4506728

fbshipit-source-id: e5b65ad93e443fbba22164319c985ebc8424554a

5 years agoFix exception_wrapper::throwException when called before main
Yedidya Feldblum [Fri, 17 Feb 2017 05:07:49 +0000 (21:07 -0800)]
Fix exception_wrapper::throwException when called before main

[Folly] Fix `exception_wrapper::throwException` when called before `main`.

When the `exception_wrapper` is empty, then `throwException` emits a message to `std::cerr` and terminates. If called before `main` begins or after `main` ends, then `std::cerr` might not have been constructed yet or might have already been destructed. Bad. Segfault, etc. So we need to ensure that `std::cerr` is alive by holding an instance of `std::ios_base::Init`.

Reviewed By: Orvid

Differential Revision: D4576190

fbshipit-source-id: dd84b5e82eb6bd817d405baf530714e0f4c314c5

5 years agoDrop support for Clang < 3.9
Yedidya Feldblum [Thu, 16 Feb 2017 22:45:30 +0000 (14:45 -0800)]
Drop support for Clang < 3.9

Summary: [Folly] Drop support for Clang < 3.9.

Reviewed By: igorsugak

Differential Revision: D4567233

fbshipit-source-id: cd94c711f0390d249b6736ab292721a477022b02

5 years agoWorkaround MSVC 2015 limitations in Traits.h
Christopher Dykes [Thu, 16 Feb 2017 22:02:54 +0000 (14:02 -0800)]
Workaround MSVC 2015 limitations in Traits.h

Summary: MSVC 2015 has issues with templated `using` declarations using `decltype`, so adjust the definition to use constexpr evaluation to fill a template parameter of a base type instead.

Reviewed By: yfeldblum

Differential Revision: D4510155

fbshipit-source-id: cc2e33625b515085dff4e682971299810905fef0

5 years agoAdjust a few things to avoid triggering warnings under MSVC
Christopher Dykes [Thu, 16 Feb 2017 21:10:26 +0000 (13:10 -0800)]
Adjust a few things to avoid triggering warnings under MSVC

Summary: This includes both unused parameters (W4100) and conditional expression is constant (W4127).

Reviewed By: yfeldblum

Differential Revision: D4525057

fbshipit-source-id: 7c057dbe239d02fa2e3ce96373d53814591994ec

5 years agoUse std::this_thread::yield rather than sched_yield
Christopher Dykes [Thu, 16 Feb 2017 21:08:47 +0000 (13:08 -0800)]
Use std::this_thread::yield rather than sched_yield

Summary: They do the same thing, and the first is portable.

Reviewed By: yfeldblum

Differential Revision: D4569649

fbshipit-source-id: db0434766f674a7789d6e59335e122b4d2131e06

5 years agoFix data race in Futex<EmulatedFutexAtomic>
Maged Michael [Thu, 16 Feb 2017 20:19:29 +0000 (12:19 -0800)]
Fix data race in Futex<EmulatedFutexAtomic>

Summary: Fixed a data race between an atomic store by the waker and a nonatomic memcpy by the waiter.

Reviewed By: nbronson

Differential Revision: D4572410

fbshipit-source-id: 3982ca433e0f628636916516e35aeb7738ae030f

5 years agoAdd AtomicIntrusiveLinkedList::reverseSweep()
Lovro Puzar [Thu, 16 Feb 2017 11:33:51 +0000 (03:33 -0800)]
Add AtomicIntrusiveLinkedList::reverseSweep()

Summary: In D4558451 I want to pull elements off an atomic list onto a thread-local (single-consumer) vector and pop to get elements in insertion order.  A sweep that provides elements in LIFO order will avoid a redundant pair of list reversals.

Reviewed By: nbronson

Differential Revision: D4564816

fbshipit-source-id: 38cf50418e6afe0be3eec96ce85d571c65f06d7e

5 years agooptimize EliasFanoEncoder::defaultNumLowerBits
Philip Pronin [Wed, 15 Feb 2017 20:10:01 +0000 (12:10 -0800)]
optimize EliasFanoEncoder::defaultNumLowerBits

`defaultNumLowerBits` is heavily used during PL encoding with
optimally-partitioned EF. This diff improves its performance by 3.5x by
avoiding expensive 64-bit division.

Reviewed By: ot, luciang

Differential Revision: D4564615

fbshipit-source-id: 4521d3c05f19573cd2c84f702fcfeaace5f98e77

5 years agoReplace the future-splitting system
Phil Willoughby [Wed, 15 Feb 2017 11:37:16 +0000 (03:37 -0800)]
Replace the future-splitting system

The previous mechanism in SharedPromise doesn't work if the lifetime of the
SharedPromise object ends before the Future which it was splitting is

This variation on the same theme doesn't have that problem.

Reviewed By: spacedentist

Differential Revision: D4339670

fbshipit-source-id: f619762bff1390481715575b3e638ec26b5c4edd

5 years agoFix undefined behaviour
Anton Likhtarov [Wed, 15 Feb 2017 01:35:35 +0000 (17:35 -0800)]
Fix undefined behaviour

Summary: memcpy's src cannot be nullptr even if the size is 0.

Reviewed By: djwatson

Differential Revision: D4560100

fbshipit-source-id: 37cd3ed73f902a136f711a5c1a918258f94d1063

5 years agoAdd overloads of Range::{start,end}sWith with custom comparator
Alex Malyshev [Tue, 14 Feb 2017 19:09:42 +0000 (11:09 -0800)]
Add overloads of Range::{start,end}sWith with custom comparator

Summary: Intended to be used for case-insensitive prefix/suffix matching.

Reviewed By: yfeldblum

Differential Revision: D4552336

fbshipit-source-id: 0030b883426dd67bea27c3f878279359d51e1d33

5 years agoTimestamping callback interface in folly::AsyncSocket
Maxim Georgiev [Tue, 14 Feb 2017 01:32:45 +0000 (17:32 -0800)]
Timestamping callback interface in folly::AsyncSocket

Summary: Adding an interface to folly::AsyncSocket allowing to receive timestamp notifications collected using recvmsg(fd, MSG_ERRQUEUE, ...).

Reviewed By: djwatson

Differential Revision: D4329066

fbshipit-source-id: 154f5c0d04e5c0e410081d48c937af4069479fc2

5 years agoadd Range constructors from std::array
Adam Simpkins [Sat, 11 Feb 2017 01:11:44 +0000 (17:11 -0800)]
add Range constructors from std::array

Add explicit constructors to create Range objects referring to the contents of
a std::array.

D4165608 previously added a folly::range() factory function to create Ranges
around const arrays.  However, it did not support non-const arrays.  However,
providing this as a constructor seems better.  This new constructor does not
appear ambiguous with any existing constructors, and a constructor allows for
more natural support of non-const arrays: the caller can explicitly indicate
if they want to construct a Range to const or non-const data in this case.

Reviewed By: yfeldblum

Differential Revision: D4523515

fbshipit-source-id: c1a262f9e8f76907d87d80b03f252576506e70ab

5 years agoMinor GDB script fix
Andrii Grynenko [Fri, 10 Feb 2017 20:56:56 +0000 (12:56 -0800)]
Minor GDB script fix

Reviewed By: lbrandy

Differential Revision: D4544705

fbshipit-source-id: d60f2026d31c94e020df51f8c887b995986ddcd7

5 years agochanged to reflect SharedMutex as default
Jack Montgomery [Fri, 10 Feb 2017 20:39:08 +0000 (12:39 -0800)]
changed to reflect SharedMutex as default

Summary: folly/docs/ now reflects the fact that SharedMutex is default mutex for Synchronized

Reviewed By: yfeldblum

Differential Revision: D4529851

fbshipit-source-id: b3b8eafe908ba92e3629392fbc4b856b5a99b658

5 years agoDetect identity conversion in toDynamic
Andrew Krieger [Fri, 10 Feb 2017 00:54:55 +0000 (16:54 -0800)]
Detect identity conversion in toDynamic

D4499520 added typedefs to `dynamic` which made it start matching
tests for ranges/containers. However, the typedefs are unconditional on the
actual contents of the `dynamic`. This made toDynamic(dynamic) select the
range-based conversion operator, always, which immediately asserts when
trying to do range-based iteration over an Object or a primitive. Add tests
to the converters that enable/disable depending on whether the object is
already a `dynamic` and early-out in that case.

Reviewed By: mzlee

Differential Revision: D4538617

fbshipit-source-id: f3a5aafab07946a221dcead782fc27de51afa0a6

5 years agoadd folly:hasher<bool>
Den Raskovalov [Thu, 9 Feb 2017 20:00:33 +0000 (12:00 -0800)]
add folly:hasher<bool>

hasher<bool> is a trivial thing, but it is useful, if we implement a hash function for a class by writing something like:
  return folly::Hash()(boolField1_, boolField2_, intField3_, boolField4_, someField5_)

Reviewed By: ot

Differential Revision: D4535563

fbshipit-source-id: 5e6672c2eeaebbbac80a8a066a6a0ec4838810f4

5 years agoAdd keepAlive() mechanism
Andrii Grynenko [Thu, 9 Feb 2017 18:58:07 +0000 (10:58 -0800)]
Add keepAlive() mechanism

EventBase and VirtualEventBase already had a loopKeepAlive() mechanism, which enabled libraries to prevent EventBase/VirtualEventBase from being destroyed until all keep-alive tokens were released.

This change adds generic keepAlive() support into folly::Executor. folly::Executors which don't support keep-alive mechanism yet, will just return a no-op KeepAlive token.

Reviewed By: yfeldblum

Differential Revision: D4516649

fbshipit-source-id: 869779621c746cb14d985aa73bc4536859914c03

5 years agoBenchmark string copying via the formatter
Phil Willoughby [Thu, 9 Feb 2017 12:35:54 +0000 (04:35 -0800)]
Benchmark string copying via the formatter

Using the formatter is always much slower than using the copy constructor (News at 11).

Comparing the two idioms for formatting out a single string input:
* the unsafe method (`format(theString)`) is (annoyingly) fastest for small strings; probably because cache-hits dominate the need to inspect every character to see if it is `{` or `}`
* the safe method (`format("{}",theString)`) is fastest on large strings (crossover at roughly 256 bytes)
* there isn't a lot in it between 64 and 512 bytes.

Reviewed By: yfeldblum

Differential Revision: D4423088

fbshipit-source-id: 7f8590653ab33fe62887a506ea79a43989fbfb29

5 years agoNon-const `dynamic` iterators
Andrew Krieger [Thu, 9 Feb 2017 00:03:39 +0000 (16:03 -0800)]
Non-const `dynamic` iterators

Add non-const iterators corresponding to existing iterator types
where it makes sense.

Reviewed By: yfeldblum

Differential Revision: D4499520

fbshipit-source-id: dc4ec583d3da1c6701805b30b25389fbf9311a7c

5 years agoSpecialise std::hash for folly::Optional
Sebastian Messmer [Wed, 8 Feb 2017 19:41:13 +0000 (11:41 -0800)]
Specialise std::hash for folly::Optional

Summary: This allows using folly::Optional<T> in std::unordered_map and std::unordered_set.

Reviewed By: luciang

Differential Revision: D4469938

fbshipit-source-id: b86b1a4510379b337e9de83471a4aafce6d5a6cb

5 years agoThrow custom exception type when ABD fails a result because some other token did...
Ameya Limaye [Wed, 8 Feb 2017 19:23:24 +0000 (11:23 -0800)]
Throw custom exception type when ABD fails a result because some other token did not call dispatch

Throw custom exception type when ABD fails a result because some other token did not call dispatch:
- This is useful because the caller can catch this exception and discard it if they find some other exception
- The custom exception does not give an indication of the problem. The other exception/s thrown will do that.

Reviewed By: yfeldblum

Differential Revision: D4395742

fbshipit-source-id: be80f66b1297e9faf625a2fb087590a7d0a9335d

5 years agoMake a few coersions to bool explicit
Christopher Dykes [Tue, 7 Feb 2017 19:27:44 +0000 (11:27 -0800)]
Make a few coersions to bool explicit

Summary: MSVC has warning 4800 which is triggered on implicit coercions to `bool` when not in use as the condition to a control-flow statement.

Reviewed By: yfeldblum

Differential Revision: D4518465

fbshipit-source-id: 858ab9e68215a2a667cb3ea55daf51b74368174d

5 years agoModify BaseFormatter to help static analysers
Phil Willoughby [Tue, 7 Feb 2017 08:45:01 +0000 (00:45 -0800)]
Modify BaseFormatter to help static analysers

This decouples the format-string-parser from the storage of the arguments to be
formatted: a static analyser can now define a class which derives from
`BaseFormatter` with no storage and use `BaseFormatter::operator()` to verify
the syntax of the format string and determine which arguments will be

This method of allowing overrides is resolved at compile time; the benchmarks
confirm that there is no run-time difference.

Reviewed By: yfeldblum

Differential Revision: D4507689

fbshipit-source-id: f109d81ae54dc074ac363720ef6e565520435d26

5 years agoRun clang-format over Format*.h
Phil Willoughby [Tue, 7 Feb 2017 08:44:56 +0000 (00:44 -0800)]
Run clang-format over Format*.h

Changes are planned, this will make it easier for the new code to look good
without making the older code look weird.

Reviewed By: yfeldblum

Differential Revision: D4514839

fbshipit-source-id: 43f8cd7d85901e1915cc434a0f4b5fd6bce1ec7a

5 years agoSupport compiling in C++14 mode
Christopher Dykes [Mon, 6 Feb 2017 21:44:18 +0000 (13:44 -0800)]
Support compiling in C++14 mode

The rest of Folly isn't dependent on C++17 mode in MSVC, so modify this to support not having it enabled.
This will make adoption easier as C++17 mode acts on the things the standard says are removed.

Reviewed By: yfeldblum

Differential Revision: D4509919

fbshipit-source-id: f4644f5f5ba78de8ab5192b89ac6320767b51084

5 years agoexecute callbacks as rvalue references
Sven Over [Mon, 6 Feb 2017 16:13:01 +0000 (08:13 -0800)]
execute callbacks as rvalue references

Callable objects may implement a separate `operator()` for when
they are called as rvalue references. For example, `folly::partial`
will move captured objects to the function call when invoked as
rvalue reference. That allows e.g. to capture pass a `unique_ptr`
to `folly::partial` for a function that takes a `unique_ptr` by
value or rvalue-reference.

Callbacks for `folly::Future`s are only ever executed once. They
may consume captured data. If the callback is an object that
implements a `operator()() &&`, then that one should be invoked.

This diff makes sure, callbacks passed to `folly::Future` are
invoked as rvalue references.

Reviewed By: ericniebler, fugalh

Differential Revision: D4404186

fbshipit-source-id: 9f33e442a634acb8797183d3d869840d85bd5d15

5 years agoExpose testing callbacks from AsyncSocketTest2.
Andrey Ignatov [Sat, 4 Feb 2017 09:28:42 +0000 (01:28 -0800)]
Expose testing callbacks from AsyncSocketTest2.

`TestConnectionEventCallback` and `TestAcceptCallback` are very handy and can
be used in other tests outside folly. Specifically I'm going to use them in
`ConnectHookTest`. It'll also allow to avoid copy/paste in `TransparentTlsTest`.

Reviewed By: plapukhov

Differential Revision: D4507461

fbshipit-source-id: dfaa97e26036ebb11da17a53d4a73431a295f4d4

5 years agoFix environ enumeration on Apple platforms
Matt Glazar [Sat, 4 Feb 2017 00:59:31 +0000 (16:59 -0800)]
Fix environ enumeration on Apple platforms

environ is documented to not work very well from .dylib-s (dynamic libraries) on macOS. Use the _NSGetEnviron function instead to get a pointer to environ.

<crt_externs.h> is missing from some iOS SDKs, so forward-declare _NSGetEnviron in such cases.

Reviewed By: Orvid, mzlee

Differential Revision: D4491044

fbshipit-source-id: 886d19bdd63dea14225992446b7ba132faf35054

5 years agoExpose more functions/constructors on BucketedTimeSeries
Xuli Liu [Fri, 3 Feb 2017 22:53:09 +0000 (14:53 -0800)]
Expose more functions/constructors on BucketedTimeSeries

Summary: Currently BucketedTimeSeries does not expose enough functions to allow assessing its data, therefore there is no way to do serialization/deserialization. Adding functions/constructors to support this.

Reviewed By: simpkins

Differential Revision: D4500075

fbshipit-source-id: 656ac8a208547d8d3fadf9ea150606b6e74775c9

5 years agoAdd ContainerT&& ctors to sorted_vector_map and sorted_vector_set.
Mark Logan [Fri, 3 Feb 2017 18:09:57 +0000 (10:09 -0800)]
Add ContainerT&& ctors to sorted_vector_map and sorted_vector_set.

Add ContainerT&& ctors to sorted_vector_map and sorted_vector_set,
to support more efficient bulk-construction of these containers. With the
prior constructors, the only way to do bulk-construction efficiently was
by using the iterator constructors with a pre-sorted range. If you didn't
have a presorted range, you would need to make a temporary container in
order to get a sorted range. Repeatedly calling insert() without a sorted
range is quadratic, hence not an option.

Reviewed By: yfeldblum

Differential Revision: D4491299

fbshipit-source-id: 041c546578f44ee6928c5506e8d8191092143b12

5 years agoFix worst-case quadratic behavior of iterator constructors and range insert()
Mark Logan [Fri, 3 Feb 2017 18:09:52 +0000 (10:09 -0800)]
Fix worst-case quadratic behavior of iterator constructors and range insert()

The iterator constructors and the range insert() method previously
had quadratic runtime if given an unsorted range. This is now fixed. We
append the entire range to the container, sort that subrange, and merge it
into the already-sorted container. Sorting and merging is skipped when possible.

Reviewed By: yfeldblum

Differential Revision: D4493534

fbshipit-source-id: e6d73b5c19e374001f9e340ff527c5257bef2ca3

5 years agoFix build failure with GCC 5
Pádraig Brady [Thu, 2 Feb 2017 19:35:54 +0000 (11:35 -0800)]
Fix build failure with GCC 5

GCC 5 doesn't recognize LOG(FATAL) as [[noreturn]],
so remove [[noreturn]] to avoid that warning and build failure.

Reviewed By: yfeldblum

Differential Revision: D4484625

fbshipit-source-id: ca129ca3a52239becd7d80f99107e64745bf8838

5 years agoCorrect the API of some functions in the portability headers
Christopher Dykes [Thu, 2 Feb 2017 01:22:36 +0000 (17:22 -0800)]
Correct the API of some functions in the portability headers

Summary: They were based on the signatures of the original functions as defined by MSVC. They should be based on the signatures as defined by Posix instead.

Reviewed By: yfeldblum

Differential Revision: D4471711

fbshipit-source-id: 8a6fd60ba2b326ca57058c119fc77c46f1d21d10

5 years agoAssorted cleanups for folly/portability/BitsFunctexcept.h
Yedidya Feldblum [Wed, 1 Feb 2017 21:57:34 +0000 (13:57 -0800)]
Assorted cleanups for folly/portability/BitsFunctexcept.h

Summary: [Folly] Assorted cleanups for `folly/portability/BitsFunctexcept.h`.

Reviewed By: Orvid, smeenai

Differential Revision: D4492264

fbshipit-source-id: 5e85ac2ad96ef84627cc5473ec0b16c4c9b5da26

5 years agoMPMCQueue Wrapper with priorities
Scott Michelson [Wed, 1 Feb 2017 20:03:48 +0000 (12:03 -0800)]
MPMCQueue Wrapper with priorities

Summary: In many cases where MPMCQueue would be used, it's useful to be able to prioritize requests. This implements a thin wrapper on MPMCQueue to accomplish this (albeit in a bit of a memory inefficient way)

Reviewed By: haijunz

Differential Revision: D4465498

fbshipit-source-id: 6630b80ccf3138b5c135e7f7f281133b37d82b4d

5 years agoSwap a few APIs to reduce sign and implicit truncations required to work with it
Christopher Dykes [Wed, 1 Feb 2017 01:35:51 +0000 (17:35 -0800)]
Swap a few APIs to reduce sign and implicit truncations required to work with it

Summary: This results in a more uniform API within Folly, allowing for a more uniform API to use outside of Folly.

Reviewed By: yfeldblum

Differential Revision: D4471471

fbshipit-source-id: f798a6498bd1a05ed12adea362ff4aedd25789ee

5 years agoUse std::chrono::high_resolution_clock for folly::Benchmark
Christopher Dykes [Wed, 1 Feb 2017 00:34:49 +0000 (16:34 -0800)]
Use std::chrono::high_resolution_clock for folly::Benchmark

Summary: `clock_gettime(CLOCK_REALTIME)` is based on `std::system_clock` on Windows, but that only has a resolution that's the same as `FILETIME` (100s of nanoseconds), so modernize things and use `std::chrono::high_resolution_clock` which is intended for this purpose.

Reviewed By: yfeldblum

Differential Revision: D4476671

fbshipit-source-id: 3db1debc8f408f689b5c9fe1966a72b8dad4da93

5 years agoFunctionScheduler - set running_ when it has actually started running
Igor Adamski [Tue, 31 Jan 2017 10:15:36 +0000 (02:15 -0800)]
FunctionScheduler - set running_ when it has actually started running

When start() throws because of reasons (in my case it was std::system_error("Resource temporarily unavailalble") coming from std::thread constructo)
and during the exception propagation we will have to destroy FunctionScheduler then
thread_.join() in shutdown will throw again.
This diff sets running_ after the thread is created.

Reviewed By: yfeldblum

Differential Revision: D4469816

fbshipit-source-id: cde54dfbf39f04d3ea9dfa02a65295f5440e5ea4

5 years agoRequire compile-time constant format strings to `shellify`
Phil Willoughby [Tue, 31 Jan 2017 09:37:27 +0000 (01:37 -0800)]
Require compile-time constant format strings to `shellify`

Because it's impossible to require that a parameter to a function is a compile-time constant string this replaces `shellify()` with the user-defined-literal suffix `_shellify()`.

It's trivial to convert previously-correct code: `shellify("whatever {}", A)` => `"whatever {}"_shellify(A)`

The previous `folly::shellify()` API is still present as a transition measure. Compilers will issue a deprecation warning if it is used.

Reviewed By: yfeldblum

Differential Revision: D4435512

fbshipit-source-id: 6639cd91280dc72108e47a8a7775c5160a4e644f

5 years agocrt_externs.h is not available on all platforms
Michael Lee [Tue, 31 Jan 2017 00:00:33 +0000 (16:00 -0800)]
crt_externs.h is not available on all platforms

Summary: Different deployments of don't always have access to crt_externs.h.

Reviewed By: yfeldblum, Orvid

Differential Revision: D4480621

fbshipit-source-id: f0b18d15fa253d6ba28dee68859cf9a34bf41255

5 years agoFix folly/
Michael Lee [Mon, 30 Jan 2017 21:15:26 +0000 (13:15 -0800)]
Fix folly/

Summary: Missed a `\`

Reviewed By: Orvid

Differential Revision: D4483602

fbshipit-source-id: 91451c3476756125abdbd0dd98ab9fb38bcf2c32

5 years agoSplit up experimental/TestUtil
Michael Lee [Mon, 30 Jan 2017 20:03:04 +0000 (12:03 -0800)]
Split up experimental/TestUtil

Summary: TestUtil is primarily a temporary file and temporary directory.  Split out the env variable manipulation into a different file.

Reviewed By: Orvid

Differential Revision: D4482071

fbshipit-source-id: 9d1a4a08010a8fad270aa56a7e1432829eb6484c

5 years agochar ** enivron is inconsistent on some platforms
Michael Lee [Sun, 29 Jan 2017 03:43:50 +0000 (19:43 -0800)]
char ** enivron is inconsistent on some platforms

Summary: The forward declaration of `extern char ** environ` is inconsistent on some platforms.

Reviewed By: strager, Orvid

Differential Revision: D4474856

fbshipit-source-id: c73a7c7d5a247e962fab06aeb65df7815f0e3bcb

5 years agoRFC: Include timeout duration in exception message
Jason Rahman [Sat, 28 Jan 2017 06:24:55 +0000 (22:24 -0800)]
RFC: Include timeout duration in exception message

Summary: For debugging purposes, it's often extremely useful to have the duration of the expired timeout in the exception message (in case the timeout was excessively low, or to understand exactly how long the operation ran before failing due to timeout). Here we make a best effort to include the timeout when possible.

Reviewed By: yfeldblum

Differential Revision: D4476038

fbshipit-source-id: f2d0aa5e1f6367a3cfe20579c27577ab91fd8d9c

5 years agoActually do the stress test on RCURefCount and make the TLRefCountTest not take 2...
Christopher Dykes [Sat, 28 Jan 2017 00:45:00 +0000 (16:45 -0800)]
Actually do the stress test on RCURefCount and make the TLRefCountTest not take 2 minutes

Summary: Adjusting the iteration count significantly reduces the runtime of the `TLRefCount.Stress` test to ~5 seconds. Working with that same timeframe, we can get away with increasing the iteration count of the (now tested) `RCURefCount.Stress` test to 100k, up from it's previous 10k.

Reviewed By: markisaa

Differential Revision: D4477750

fbshipit-source-id: 6a89dbb65f460655db0cb33926cc331dc1904f1c

5 years agoNamespace rename from UpperCamelCase to snake_case
Phil Willoughby [Fri, 27 Jan 2017 14:43:33 +0000 (06:43 -0800)]
Namespace rename from UpperCamelCase to snake_case

`folly::literals` is to `folly` what `std::literals` is to `std`.

More importantly we should be consitent;  snake_case is how other folly sub-namespaces are named, such as:


Reviewed By: ericniebler

Differential Revision: D4468281

fbshipit-source-id: de10bec74c9a38f387d62bd55da947291c23970b

5 years agoImplemented IPAddressV6::getMacAddressFromLinkLocal
Angelo Failla [Fri, 27 Jan 2017 08:35:27 +0000 (00:35 -0800)]
Implemented IPAddressV6::getMacAddressFromLinkLocal

Summary: It is possible to extract a MAC address from a link-local IPv6 address. This diff provides the logic for it.

Reviewed By: simpkins

Differential Revision: D4461970

fbshipit-source-id: cb4a5d774c3b4a20716d1742c961e02952ddf80d

5 years agoMove the Environment portability header to the stdlib header
Christopher Dykes [Fri, 27 Jan 2017 02:11:24 +0000 (18:11 -0800)]
Move the Environment portability header to the stdlib header

Summary: This completely kills the environment portability header, which was among the earliest, and was created before the general convention of splitting based on the header they are in, in the standard library, existed. The functions that were defined in it are expected to be in stdlib, so move them there.

Reviewed By: mzlee

Differential Revision: D4462502

fbshipit-source-id: c4549b9d1ea623644223db4365b81507f443ad5e

5 years agoMake most implicit integer truncations and sign conversions explicit
Christopher Dykes [Fri, 27 Jan 2017 02:01:31 +0000 (18:01 -0800)]
Make most implicit integer truncations and sign conversions explicit

This makes a large number of implicit truncations and sign conversions into explicit casts, in preparation for eventually enabling `-Wconversion` on Folly.
This set of changes should have zero semantic change.

This focuses on the core of Folly and leaves the tests alone for the most part. A future diff will cleanup the warnings in the tests as well.

Reviewed By: yfeldblum

Differential Revision: D4454096

fbshipit-source-id: af1e1831675a804ec5679266c30c1fae62e8c35c

5 years agoAdd __builtin___clear_cache to the portability headers
Christopher Dykes [Thu, 26 Jan 2017 18:44:00 +0000 (10:44 -0800)]
Add __builtin___clear_cache to the portability headers

HHVM uses this heavily in it's ARM JIT, so provide an implementation. With GCC & Clang this function is a no-op on x86_64 where the requirement doesn't exist, so do the same in the portability header.
This doesn't include the Windows portability header on x64 specifically because it is a very heavy header and this is currently very lightweight.

Reviewed By: yfeldblum

Differential Revision: D4451032

fbshipit-source-id: 0af57448577635f9cd690ea9b09ce46a244191e1

5 years agoAdd ability to set custom SSLContext on TestSSLServer
Daniel Sommermann [Wed, 25 Jan 2017 21:01:37 +0000 (13:01 -0800)]
Add ability to set custom SSLContext on TestSSLServer

This is needed if you want to test other scenarios where the
server has other OpenSSL settings.

Differential Revision: D4463587

fbshipit-source-id: ffd4019e921649dee703363b2ff028b4d8063210

5 years agoRe-Gate setenv/unsetenv
Michael Lee [Wed, 25 Jan 2017 17:36:05 +0000 (09:36 -0800)]
Re-Gate setenv/unsetenv

Summary: `setenv`/`unsetenv` is not always declared the same way on all of the places folly is compiled.

Reviewed By: matbd

Differential Revision: D4462056

fbshipit-source-id: 6dd68f6fc5a6a435f145cbaa43bee02b5fa7170c

5 years agoSplit out SSL test server for reuse
Daniel Sommermann [Wed, 25 Jan 2017 17:32:24 +0000 (09:32 -0800)]
Split out SSL test server for reuse

The TestSSLServer is useful to have on its own for reuse. This
diff separates it out to make reuse possible.

Reviewed By: yfeldblum

Differential Revision: D4457976

fbshipit-source-id: 1fe6b71e930859ef04487e29047dcf603a79834b

5 years agoFix JemallocNodumpAllocator when compiled without folly-config.h
Christopher Dykes [Wed, 25 Jan 2017 16:49:59 +0000 (08:49 -0800)]
Fix JemallocNodumpAllocator when compiled without folly-config.h

Summary: HHVM compiles without `folly-config.h`, so this was preventing us from updating to the newest version of Folly.

Reviewed By: yfeldblum

Differential Revision: D4456890

fbshipit-source-id: ed118ff0cf7f254a5f99be68f171d1b34ebf5c5c

5 years agoAdd disableTransparentTls call
Petr Lapukhov [Wed, 25 Jan 2017 05:23:20 +0000 (21:23 -0800)]
Add disableTransparentTls call

Summary: Similar to AsyncSocket, allow setting reserved sockopt after bind(). This will be recognized by intercepted accept4() call and forked sockets will properly have the TLS flag disabled.

Reviewed By: djwatson

Differential Revision: D4458831

fbshipit-source-id: fa753b9d849bd661563364d36229113f7abb0ee0

5 years agoActually allow SFINAE to occur with setThreadName
Christopher Dykes [Wed, 25 Jan 2017 00:15:19 +0000 (16:15 -0800)]
Actually allow SFINAE to occur with setThreadName

It wasn't actually SFINAE the way it was setup previously, which meant it was just a hard error under MSVC.

Reviewed By: yfeldblum

Differential Revision: D4453702

fbshipit-source-id: 5be600fb5ecdc8255795fefbd37c1fe26e7266dd

5 years agofolly: remove unused includes
Mathieu Baudet [Tue, 24 Jan 2017 22:34:42 +0000 (14:34 -0800)]
folly: remove unused includes

Found with our include analysis tool.

I had to tweak `portability/Environment.h` to avoid a false positive breaking win32.

Reviewed By: yfeldblum, Orvid

Differential Revision: D4452463

fbshipit-source-id: e2e862e204892037ddde8815218e4deab1bfbb06

5 years agoAdd needsPeerVerification function to check if peer cert should be verified
Ryan Wilson [Tue, 24 Jan 2017 22:22:17 +0000 (14:22 -0800)]
Add needsPeerVerification function to check if peer cert should be verified

This patch adds a function to AsyncSSLSocket, so the user can check if the peer cert
should be verified. This allows the user to implement custom logic for peer cert validation.

Reviewed By: Orvid

Differential Revision: D4456402

fbshipit-source-id: 2f8a5c932d0341d6c9290bcb52264dd4fa174263

5 years agoEnsure portability/Windows.h is included before OpenSSL headers
Christopher Dykes [Tue, 24 Jan 2017 21:28:28 +0000 (13:28 -0800)]
Ensure portability/Windows.h is included before OpenSSL headers

Summary: Because OpenSSL is evil to Windows, and you have to forcefully include winsock2 before winsock.

Reviewed By: yfeldblum

Differential Revision: D4453742

fbshipit-source-id: 3b1b5b1f999722559693164148245f52b1e94104

5 years agofix use-after-free in addFunctionOnce
Igor Zinkovsky [Fri, 20 Jan 2017 23:45:47 +0000 (15:45 -0800)]
fix use-after-free in addFunctionOnce

Summary: see title

Reviewed By: meyering

Differential Revision: D4441266

fbshipit-source-id: 4a8f589e2995a463e54b3979035a623824acf39e

5 years agoMade atomics generic in hazptr_owner member functions
Maged Michael [Fri, 20 Jan 2017 20:20:31 +0000 (12:20 -0800)]
Made atomics generic in hazptr_owner member functions

As suggested by the C++ committee in November 2016, made atomics generic to allow other atomic types (e.g.,  folly::DeterministicAtomic<T*>),

Also removed obsolete comments.

Reviewed By: davidtgoldblatt

Differential Revision: D4443355

fbshipit-source-id: d9e21a959f2c7e3dd07c0ed4808236da80ef6dcd

5 years agoDefine AF_LOCAL in the socket portability layer
Christopher Dykes [Fri, 20 Jan 2017 18:35:09 +0000 (10:35 -0800)]
Define AF_LOCAL in the socket portability layer

Summary: It's the exact same as `PF_LOCAL`, and is used interchangibly.

Reviewed By: yfeldblum

Differential Revision: D4439558

fbshipit-source-id: fd1ff813db5349369fc77888dfd854fc36a2a3be

5 years agoClear OpenSSL error stack after loading certificate file.
Kyle Nekritz [Fri, 20 Jan 2017 17:02:40 +0000 (09:02 -0800)]
Clear OpenSSL error stack after loading certificate file.

Summary: SSL_CTX_load_verify_locations interally end up using X509_load_cert_crt_file, which has an unchecked call to X509_STORE_add_cert. This can fail and add an error to the error stack without causing SSL_CTX_load_verify_locations to return an error.

Reviewed By: siyengar

Differential Revision: D4442017

fbshipit-source-id: a4cf7f5ee2c18d90d5d61baf3acb99ffca6b8af0

5 years agoRevert D4389970: add an option to clear error before calling ssl methods
Luca Niccolini [Fri, 20 Jan 2017 00:50:37 +0000 (16:50 -0800)]
Revert D4389970: add an option to clear error before calling ssl methods

Summary: This reverts commit 12da254d6b281c2b9d522ba19999b2489c0083a2

Differential Revision: D4389970

fbshipit-source-id: 7651425adcf3b86c066d657308af1a0aa6bce5dd

5 years agoEnable EOR flag configuration for folly::AsyncSocket.
Maxim Georgiev [Fri, 20 Jan 2017 00:14:24 +0000 (16:14 -0800)]
Enable EOR flag configuration for folly::AsyncSocket.

Summary: EOR flag was hardcoded to "false" in folly::AsyncSocket. This diff enables changing EOR flag using AsyncSocket::setEorTracking() method.

Reviewed By: yfeldblum

Differential Revision: D4421966

fbshipit-source-id: 2e1b9b19ced6555845396ec33bfd3d5feb710640

5 years agoModernise and clang-format existing formatting benchmark
Phil Willoughby [Thu, 19 Jan 2017 21:42:48 +0000 (13:42 -0800)]
Modernise and clang-format existing formatting benchmark

Summary: Changes nothing fundamental, just makes it easier to work on in the future.

Reviewed By: yfeldblum

Differential Revision: D4435805

fbshipit-source-id: 725944a12922abde137bb7e21726c97beb558b5f

5 years agoAdd fiber-print-limit command
Andrii Grynenko [Thu, 19 Jan 2017 01:09:38 +0000 (17:09 -0800)]
Add fiber-print-limit command

Summary: Limits number of fibers printed for each FiberManager.

Reviewed By: yfeldblum

Differential Revision: D4432488

fbshipit-source-id: 1791c2bfe6d5b0c2f54142dc068b473fd72f5d5d

5 years agoAdding 'compound assignment union operator' for folly::WriteFlags enum class
Maxim Georgiev [Wed, 18 Jan 2017 22:30:57 +0000 (14:30 -0800)]
Adding 'compound assignment union operator' for folly::WriteFlags enum class

Summary: There is "operator|()" defined for folly::WriteFlags enum class, but no "operator=|()". Because of that adding a new flag to an existing set of flags looks awkward. Adding the missing operator.

Reviewed By: yfeldblum

Differential Revision: D4421892

fbshipit-source-id: a053a8cc5b1d07579c233d19029a9801b8188413

5 years agoAdd a missing #include. Remove an unnecessary #include.
Eric Niebler [Wed, 18 Jan 2017 17:26:27 +0000 (09:26 -0800)]
Add a missing #include. Remove an unnecessary #include.

'Nuf said.

Depends on D4413112

Reviewed By: yfeldblum, spacedentist

Differential Revision: D4425605

fbshipit-source-id: a7c98867cfa5c859a1b4d2eb78724710c4f1115f

5 years agoDrop unneeded Pthread include
Christopher Dykes [Mon, 16 Jan 2017 02:21:28 +0000 (18:21 -0800)]
Drop unneeded Pthread include

Summary: It was killed in an earlier diff.

Reviewed By: yfeldblum

Differential Revision: D4418832

fbshipit-source-id: c9a5134fa100b24a3394607dea20e6e8a8d341e1

5 years agoDon't use Pthread in EventBase
Christopher Dykes [Mon, 16 Jan 2017 01:46:24 +0000 (17:46 -0800)]
Don't use Pthread in EventBase

Pthread is currently a dependency of Folly that is not really necessary on Windows, or even with standard C++ for the most part, so start work on killing it in Folly.
This switches EventBase to using `std::thread::id`'s instead, which also means we aren't reliant on the implementation detail that thread id 0 is invalid. Well, we are, but it's now the standard library's fault not ours.

Reviewed By: yfeldblum

Differential Revision: D4418128

fbshipit-source-id: a9c95ac6c7305c960156a4ad684b6db89b5856d9

5 years agoSupport setting thread name via std::thread::id
Christopher Dykes [Mon, 16 Jan 2017 01:46:23 +0000 (17:46 -0800)]
Support setting thread name via std::thread::id

Summary: It's possible via some hackery, so wrap it up nicely into the API.

Reviewed By: yfeldblum

Differential Revision: D4418728

fbshipit-source-id: f00aed95cdbdc3cc83a0ab96565117cd01141c2e

5 years agoremove override from adjacent_tokens_only
Igor Sugak [Sat, 14 Jan 2017 00:36:13 +0000 (16:36 -0800)]
remove override from adjacent_tokens_only

Our internal version of boost contains a patch that reverts the following commit to boost filesystem module:

It was done due to a breaking change that disallows the use of "--key value" for implicit options, allowing only "--key=value" style syntax. Since there are too many tests to fix, and it's probably going to be reverted in the upstream as well (see below), removing the `override` keyword here to fix folly build.

Reviewed By: meyering

Differential Revision: D4415347

fbshipit-source-id: c215331338b3aa218d26890a83aa0b363514fe79

5 years agoProtect memcpy calls against undefined behaviour
Marcus Holland-Moritz [Fri, 13 Jan 2017 21:47:19 +0000 (13:47 -0800)]
Protect memcpy calls against undefined behaviour

While running a UBSan enabled binary, I got:

  folly/io/IOBuf.cpp:671:15: runtime error: null pointer passed as argument 2, which is declared to never be null

This change protects all calls to memcpy from passing `nullptr`.

Reviewed By: pixelb

Differential Revision: D4415355

fbshipit-source-id: a27ba74244abcca8cd4e106967222890a67f5b6d

5 years agofolly/Traits.h: fix a deep problem with FBVector
Jim Meyering [Fri, 13 Jan 2017 21:01:25 +0000 (13:01 -0800)]
folly/Traits.h: fix a deep problem with FBVector

This started when many fbvector-related tests began failing with reports of
ASAN-detected heap abuse (usually invalid free of an address 16 bytes
into an already-freed buffer).

It was very specific, though. The bug struck only when:
  - gcc-5-based platform
  - compiling with clang (~3.8) and GCC5's libstdc++, not gcc
  - strings were short enough to reside within an in-situ std::string

Why? because FBVector.h:1588's conditional:

  if (folly::IsRelocatable<T>::value && usingStdAllocator::value) {

was true for clang (erroneously), but false for gcc. The difference
was in `IsRelocatable<std::string>::value`.  However, manual tests showed that
each component from the definition of `IsRelocatable` were the same for both
gcc and clang. Then Jay Feldblum realized that we'd probably specialized
that trait for `std::string`, and sure enough, I found the culprit:


Reviewed By: pixelb

Differential Revision: D4414159

fbshipit-source-id: 60e3fb4b096ec77cbd2b48c561e5c6ec8f128fff

5 years agocapture exception information when creating exception_wrapper
Eric Niebler [Fri, 13 Jan 2017 20:16:51 +0000 (12:16 -0800)]
capture exception information when creating exception_wrapper

prefer creating an exception_wrapper with a reference to the active exception

Depends on D4410421

Reviewed By: spacedentist

Differential Revision: D4410455

fbshipit-source-id: d6b6aeb5fa72782e31d754a0b853514af5fdb8cd

5 years agoAdd AsyncSSLSocket option to turn off transparent tls
Dave Watson [Fri, 13 Jan 2017 18:32:13 +0000 (10:32 -0800)]
Add AsyncSSLSocket option to turn off transparent tls

Summary: Folly parts of D4383906.

Reviewed By: plapukhov

Differential Revision: D4387254

fbshipit-source-id: 3c039720c88c91b7292d60a85272dd1978510296

5 years agoSlight simplification of exception_wrapper constructor
Yedidya Feldblum [Wed, 11 Jan 2017 04:53:38 +0000 (20:53 -0800)]
Slight simplification of exception_wrapper constructor

Summary: [Folly] Slight simplification of `exception_wrapper` constructor.

Reviewed By: ericniebler

Differential Revision: D4391899

fbshipit-source-id: ddb066723bcd10abb0dbbaeab12b1e9be4f39acc

5 years agoadd an option to clear error before calling ssl methods
Subodh Iyengar [Tue, 10 Jan 2017 23:51:33 +0000 (15:51 -0800)]
add an option to clear error before calling ssl methods

Normally clearing out the error before calling into an openssl method
is a bad idea. However there might be other code outside AsyncSSLSocket
calling into openssl in the same thread that doesn't use openssl
correctly. This allows users of AsyncSSLSocket to safeguard themselves
from such code.

Reviewed By: anirudhvr

Differential Revision: D4389970

fbshipit-source-id: 12da254d6b281c2b9d522ba19999b2489c0083a2

5 years agoFix an inefficiency in json-serializing a dynamic with sorted keys
Yedidya Feldblum [Tue, 10 Jan 2017 19:57:31 +0000 (11:57 -0800)]
Fix an inefficiency in json-serializing a dynamic with sorted keys

[Folly] Fix an inefficiency in json-serializing a `dynamic` with sorted keys.

The inefficiency is that, at each level of the `dynamic` which is map-typed, we effectively make a full copy of the `dynamic` object. This can be expensive.

Reviewed By: Gownta

Differential Revision: D4389671

fbshipit-source-id: 223739397f913d3e65a421a9a4dcb089ec757ec6

5 years agofix typo in comments. s/unitialized/uninitialized/g
kumagi [Tue, 10 Jan 2017 19:55:42 +0000 (11:55 -0800)]
fix typo in comments. s/unitialized/uninitialized/g

`unitialized` seems to be typo.

Reviewed By: igorsugak

Differential Revision: D4397318

Pulled By: yfeldblum

fbshipit-source-id: a2e6c665b4dfe95d769430405886b0725423aac2

5 years agoRename exception_wrapper::getExceptionPtr to to_exception_ptr
Yedidya Feldblum [Tue, 10 Jan 2017 04:30:42 +0000 (20:30 -0800)]
Rename exception_wrapper::getExceptionPtr to to_exception_ptr

[Folly] Rename `exception_wrapper::getExceptionPtr` to `to_exception_ptr`.

Make it clear that this will sometimes be an expensive operation. Using the word `to` evokes the possibility of an expensive conversion, while using the word `get` implies cheap access.

Reviewed By: djwatson

Differential Revision: D4391621

fbshipit-source-id: 33ca051d9be5a6050ba9f30b20faee35b7e58afb

5 years agoFix dynamic MPMCQueue tryObtainPromisedPushTicket() to prevent tryWriteUntil() and...
Maged Michael [Tue, 10 Jan 2017 02:31:20 +0000 (18:31 -0800)]
Fix dynamic MPMCQueue tryObtainPromisedPushTicket() to prevent tryWriteUntil() and writeIfNotFull() from blocking indefinitely for a matching read.

The bug was reported by Alexander Pronchenkov in

Under certain conditions a `tryWriteUntil()`--and also `writeIfNotFull()`--operation may block indefinitely awaiting a matching read. This could happen because in each dynamic MPMCQueue expansion, typically one or two tickets are associated with the closed array not the new one. In the incorrect code, a `tryWriteUntil()` operation that induced expansion but gets a ticket associated with the closed array, incorrectly assumes that because the expansion succeeded then there is space for it. However because the ticket is associated with the closed array, the operation needs to wait (possibly indefinitely) for space to open in the closed array.

The fix: Changed the code in tryObtainPromisedPushTicket() such that the operation tries to acquire a ticket only if there is promised space in the array associated with that ticket. If there is no space, an expansion is attempted if the ticket is not associated with a closed array. If not or if expansion fails because of reaching maximum capacity or for being out-of-memory, then the operation returns false without attempting to acquire the ticket.

Other changes:
- Added a note about this difference in semantic between the dynamic and non-dynamic version to the main comment about the dynamic version.
- Changed `oldCap` to `curCap` because the value is actually current not old.
- Added two tests for checking that tryWriteUntil() never blocks indefinitely for both dynamic and non-dynamic versions.
- Removed all the `never_fail` tests for the dynamic version, because such operations may fails as described above.
- Added `asm_volatile_pause` when spinning on the seqlock.

Reviewed By: djwatson

Differential Revision: D4389347

fbshipit-source-id: c46dbefc9fe08e146250d2ad8ba68b0887f97436

5 years agoUse 2 second loop smoothing period rather than 20 seconds
Christopher Dykes [Mon, 9 Jan 2017 21:04:47 +0000 (13:04 -0800)]
Use 2 second loop smoothing period rather than 20 seconds

Summary: This was accidentally changed in D4375539.

Reviewed By: philippv

Differential Revision: D4393574

fbshipit-source-id: 0420223575bad0c6b0e89f8cf5ed138e063462b9

5 years agoAdd pre received data API to AsyncSSLSocket.
Kyle Nekritz [Mon, 9 Jan 2017 19:51:34 +0000 (11:51 -0800)]
Add pre received data API to AsyncSSLSocket.

Summary: This allows something else (ie fizz) to read data from a socket, and then later decide to to accept an SSL connection with OpenSSL by inserting the data it read in front of future reads on the socket.

Reviewed By: anirudhvr

Differential Revision: D4325634

fbshipit-source-id: 05076d2d911fda681b9c4e5d9d3375559293ea35

5 years agoSet custom ssl bio read method.
Kyle Nekritz [Mon, 9 Jan 2017 19:51:33 +0000 (11:51 -0800)]
Set custom ssl bio read method.

Summary: Similar to the bio write method. This should be essentially a no-op, bioRead has the same functionality as the openssl version. This is needed in the next diff.

Reviewed By: siyengar

Differential Revision: D4325622

fbshipit-source-id: a90b9ec06bee920a1a73551a3ea4c77e1ee0ab08

5 years agoInclude <errno.h> for using "errno" and ENOMEM.
Zonr Chang [Mon, 9 Jan 2017 18:28:20 +0000 (10:28 -0800)]
Include <errno.h> for using "errno" and ENOMEM.

Summary: Closes

Reviewed By: yfeldblum

Differential Revision: D4391871

Pulled By: Orvid

fbshipit-source-id: 80401dd65ae376f9ebbb0b079577d0a1fd15475b

5 years agoRemove folly::Future conversion constructor
Nick Wolchko [Mon, 9 Jan 2017 17:20:48 +0000 (09:20 -0800)]
Remove folly::Future conversion constructor

This constructor is unsafe. The check it uses before doing the comparison isn't a safe enough check to see if the cast is valid. For example, this is broken in the presence of multiple inheritance because it doesn't adjust the pointer offset to the correct vtable.

  struct A {
    virtual ~A() {};
    virtual void doSomething() = 0;
  struct B {
    virtual ~B() {}
    virtual void doSomethingElse() = 0;
  struct C : public B, public A {
    virtual ~C() {}
    void doSomething() override {
      std::cout << "Something!" << std::endl;
    void doSomethingElse() override {
      std::cout << "Something Else!" << std::endl;
  int main (int argc, char **argv) {
    auto c = folly::makeFuture<std::shared_ptr<C>>(std::make_shared<C>());
    folly::Future<std::shared_ptr<A>> a = std::move(c);
    return 0;
This code will print "Something else!" when run.

Reviewed By: siyengar

Differential Revision: D3679673

fbshipit-source-id: dcbf40ca82d458f17ee11191591f8b8daf58c919

5 years agoFix folly json to only sort properties of objects based on their key not value.
Michael O'Farrell [Mon, 9 Jan 2017 15:22:20 +0000 (07:22 -0800)]
Fix folly json to only sort properties of objects based on their key not value.

Reviewed By: yfeldblum

Differential Revision: D4386258

fbshipit-source-id: 23499267eb4390f0f40b3643760514cae1ca7838

5 years agoremove always true if-predicate (gcc-5 -Wlogical-op)
Igor Sugak [Sun, 8 Jan 2017 05:58:13 +0000 (21:58 -0800)]
remove always true if-predicate (gcc-5 -Wlogical-op)

gcc-5 -Wlogical-op reports:
folly/io/async/AsyncSSLSocket.cpp: In member function 'void folly::AsyncSSLSocket::invalidState(folly::AsyncSSLSocket::HandshakeCB*)':
folly/io/async/AsyncSSLSocket.cpp:418:35: error: logical 'or' of collectively exhaustive tests is always true [-Werror=logical-op]

Reviewed By: yfeldblum

Differential Revision: D4391317

fbshipit-source-id: c0f5ce748f1fc21678e4080c7f6351e7fada1e2b

5 years agoadd folly::as_const, like C++17's std::as_const
Eric Niebler [Sun, 8 Jan 2017 05:44:02 +0000 (21:44 -0800)]
add folly::as_const, like C++17's std::as_const

Summary: A one-liner from C++17, but a useful one. Const-qualifies an lvalue reference, avoiding the need for an awkward const_cast in some cases.

Reviewed By: yfeldblum

Differential Revision: D4389929

fbshipit-source-id: 1650c4901489eb0dd62fd9fa633b4a0da9f01954

5 years agoProperly std::chrono'ize HHWheelTimer
Christopher Dykes [Sat, 7 Jan 2017 20:51:23 +0000 (12:51 -0800)]
Properly std::chrono'ize HHWheelTimer

Summary: It was using `std::chrono::milliseconds` to represent a point in time, so use a time point instead.

Reviewed By: yfeldblum

Differential Revision: D4378116

fbshipit-source-id: f0b10bb7894dda44d78b31672d2b6735f3e1cbf4

5 years agostd::chrono'ize EventBase::loopBody
Christopher Dykes [Sat, 7 Jan 2017 20:51:21 +0000 (12:51 -0800)]
std::chrono'ize EventBase::loopBody

Summary: Because modern is good, and this allows for cleaner interaction with the other APIs being `std::chrono`ized.

Reviewed By: yfeldblum

Differential Revision: D4377773

fbshipit-source-id: 42ad5ad8476a3678e02e9314f9592f5449102f00

5 years agostd::chrono'ize EventBase::setMaxLatency
Christopher Dykes [Sat, 7 Jan 2017 20:51:20 +0000 (12:51 -0800)]
std::chrono'ize EventBase::setMaxLatency

Summary: Onward towards more modern code!

Reviewed By: yfeldblum

Differential Revision: D4377678

fbshipit-source-id: 6ca5ecd902be9028fb55f139374f7919fa522899

5 years agoRemove <glog/logging.h> from folly/Indestructible.h
Yedidya Feldblum [Sat, 7 Jan 2017 06:40:09 +0000 (22:40 -0800)]
Remove <glog/logging.h> from folly/Indestructible.h

[Folly] Remove `<glog/logging.h>` from `folly/Indestructible.h`.

This makes the header much lighter. And abort on invalid access (the use-case for `glog`) only in `!defined(NDEBUG)` mode.

Anti-Pattern Combined Mega-Diff Description:
* Add non-`explicit` default ctor.
* Disable ctor explicitly when underlying ctor would fail to compile. Not sure how useful it would be, but it makes type-traits work correctly for whatever that is worth.
* Switch boolean flag to `erased_{false}` so that it is zero-initializable, because that's better.

Reviewed By: ericniebler

Differential Revision: D4380469

fbshipit-source-id: a39cb7470f7ee678fa722778da587409f468d985

5 years agoadd folly::void_t like C++17's std::void_t
Eric Niebler [Sat, 7 Jan 2017 02:32:01 +0000 (18:32 -0800)]
add folly::void_t like C++17's std::void_t

C++17 is adding std::void_t. It's handy for controlling class template partial specialization. Folly should have it too.


Reviewed By: yfeldblum

Differential Revision: D4387302

fbshipit-source-id: 85f955f3d8cfacbd6c9e61fb3f5cf53c056459bb

5 years agoSkip defined checks in folly/Memory.h
Yedidya Feldblum [Sat, 7 Jan 2017 00:43:48 +0000 (16:43 -0800)]
Skip defined checks in folly/Memory.h

[Folly] Skip `defined` checks in `folly/Memory.h`.

Undefined symbols, when evaluated by the preprocessor in preprocessor integer contexts, evaluate to `0`. That works for these checks.

Reviewed By: ericniebler

Differential Revision: D4385026

fbshipit-source-id: 3162f8b83431ebab2de53f9ba202e7ea8c339210