- 29 Dec, 2014 18 commits
-
-
Hans Fugal authored
Summary: Add basic timeout functionality. This adds `futures::sleep` which makes an async Future that finishes after the given duration, and `Future::get` which blocks on the result and takes an optional timeout. Introducing the folly::wangle::futures namespace (soon to be just folly::futures) which will hold our wangle utility functions, the things that live in the Future object in Twitter's scala code. We'll probably move when* and wait-ish methods in here too, and perhaps alias makeFuture-ish methods too, though James has me mostly convinced not to deprecate them at the folly::wangle level (because they're basically Future constructors and Future lives at folly::wangle) `Future::delayed` after Twitter's helper of the same name Test Plan: new and old unit tests Reviewed By: davejwatson@fb.com Subscribers: trunkagent, fugalh, exa, folly-diffs@ FB internal diff: D1748894 Tasks: 4548494 Signature: t1:1748894:1419363496:1f4a62ec8455989c1fcce845695ace1d01c101c8
-
Hans Fugal authored
Summary: Provide a way to massacre outstanding timers. Test Plan: new test, and using in wangle (different diff) Reviewed By: davejwatson@fb.com Subscribers: jsedgwick, exa, folly-diffs@ FB internal diff: D1753866 Tasks: 4548494 Signature: t1:1753866:1419361846:58ff6ca4d01b0d546495b032b454c8bf0fdb0277
-
Nathan Bronson authored
Summary: futexWaitUntil could generate an invalid timespec when presented with a time_point from before the epoch, which resulted in an EINVAL from the futex syscall. Debug builds crashed on this unexpected return value, while release builds soldiered on. This path happened to be exercised by the unit test. This diff fixes the unintentional deadline overflow in the test, adds explicit testing of overflow behavior, and makes futexWaitUntil handle invalid time_points in a sensible manner. Test Plan: 1. new unit tests 2. fbmake runtests_dbg Reviewed By: mssarang@fb.com Subscribers: strager, njormrod, folly-diffs@ FB internal diff: D1747972 Tasks: 5853949 Signature: t1:1747972:1419382193:862c193a13428d96acb33c85f962f59203661f40
-
Tao Chen authored
Summary: This reverts commit fc83e983e2376bccc80dc4b21890e3a41dbc211f. Test Plan: none Reviewed By: lucian@fb.com, robot9@fb.com Subscribers: ps, bmatheny, folly-diffs@ FB internal diff: D1756753 Tasks: 5883894, 5886688 Signature: t1:1756753:1419374764:977160379cfa49530babb38022b9d4cc80573a7d
-
Viswanath Sivakumar authored
Summary: Sometimes when the socket is destroyed from a destructor, we wouldn't want further callbacks on shutdown. We can unregister the readCallback_ by calling setReadCB(nullptr), but if the state is CONNECTING, we can still get connectErr() callback. I found an ASAN trace (https://phabricator.fb.com/P18837265) that turned out to be because of this inability to cancel this callback. This provides a way to unregister the connect callback as well. Test Plan: fbconfig -r folly && fbmake runtests Reviewed By: afrind@fb.com Subscribers: folly-diffs@ FB internal diff: D1751778 Tasks: 5852935 Signature: t1:1751778:1419363638:26967c2d4fc5819e4d65ae706d217a954dfd784f
-
Chip Turner authored
Summary: The 'test' command uses one equal sign for string equality, not two. bash apparently is okay with two, but zsh isn't, causing this test to pass if your shell was bash and fail if it was zsh. The test now passes with bash, bash in sh mode, zsh, and even dash. Test Plan: runtests, also, these pass (zsh failed before): SHELL=/bin/bash _build/dbg/folly/test/subprocess_test SHELL=/bin/sh _build/dbg/folly/test/subprocess_test SHELL=/bin/zsh _build/dbg/folly/test/subprocess_test SHELL=/bin/dash _build/dbg/folly/test/subprocess_test Reviewed By: njormrod@fb.com Subscribers: lins, anca, folly-diffs@ FB internal diff: D1756090 Signature: t1:1756090:1419360674:8576e61a6e0ee102612c5eae0e1fbd79cc397bfa
-
Chip Turner authored
Summary: Simplify the logic slightly to better handle joining paths. This makes DwarfTest.cpp pass. Test Plan: runtests Reviewed By: njormrod@fb.com Subscribers: lins, anca, folly-diffs@ FB internal diff: D1756036 Tasks: 5871014 Signature: t1:1756036:1419359254:123cc508b8836ea0b1485abe361b1c158538aa08
-
Mike Kolupaev authored
Summary: advancePastEmpty() was called for all created iterators. It only makes sense for begin(). For find() it's harmful: find() shouldn't return an iterator to the next element if the key was removed. I suspect that the same race condition was possible for insert(), but I haven't tried to reproduce it. Test Plan: Added a test for it. It fails without these changes. Reviewed By: delong.j@fb.com Subscribers: folly-diffs@, lovro FB internal diff: D1751280 Tasks: 5841499 Signature: t1:1751280:1419107193:71311ff68d92d0a4dcf1941dacdfdc23c25255cc
-
Lucian Grijincu authored
Summary: Can't connect from ipv6-only cluster to ipv4/ipv6 service which uses different ports. Test Plan: ``` ./fastcopy_server --dir . & # netstat -atnlp | grep LISTEN | grep fastc tcp 0 0 0.0.0.0:65478 0.0.0.0:* LISTEN 9348/./fastcopy_ser tcp 0 0 :::52793 :::* LISTEN 9348/./fastcopy_ser ``` Reviewed By: philipp@fb.com, sdoroshenko@fb.com Subscribers: ps, bmatheny, folly-diffs@ FB internal diff: D1752846 Tasks: 5868818 Signature: t1:1752846:1419043494:7cc0646882249f17258ade5ce7ae5619b13148a0
-
Andrei Alexandrescu authored
Summary: Some overloads, particularly with rvalue references, were missing. Also this fixes https://our.intern.facebook.com/intern/tasks/?t=5849579 Test Plan: unittests Reviewed By: simpkins@fb.com Subscribers: trunkagent, las, net-systems@, njormrod, folly-diffs@ FB internal diff: D1746319 Tasks: 5849579 Signature: t1:1746319:1418875228:febb965cf52710a5e76b7c1cce5aec601086ad90
-
Sarang Masti authored
Summary: Allow conversion from folly::StringPiece to folly::StringPiece Test Plan: - fbconfig -r folly && fbmake runtests Reviewed By: mpawlowski@fb.com Subscribers: folly-diffs@ FB internal diff: D1752609 Signature: t1:1752609:1419037172:04846f658901306b53fb60c9eafbdf0f4d4d7005
-
Kai Wang authored
Summary: For servers using GLOG, all thread ID are get from gettid system call. So it is very useful if we print this ID so during debugging I can find the log of crashing thread. I'm not sure who should review this diff. Just found you guys from previous diffs touched this file :) Test Plan: See the crash log. *** Aborted at 1419029404 (Unix time, try 'date -d @1419029404') *** *** Signal 11 (SIGSEGV) (0x18) received by PID 18852 (pthread TID 0x7f52a1fff700) (linux TID 27908), stack trace: *** Reviewed By: tudorb@fb.com Subscribers: seanc, folly-diffs@ FB internal diff: D1752301 Signature: t1:1752301:1419032887:e43c2ace6914e54812149a8b8e84eaffaf42a09c
-
Andrew Gallagher authored
Summary: - Allow both `baseDir` and `subDir` to be empty. This can happen if DW_AT_comp_dir is `.` and gets simplified to the empty string. (The DWARF standard doesn't appear to disallow relative dirs here, but I couldn't find anthing definitive). - Fix `./` prefix stripping to avoid making paths like `.///hello` absolute. - Fix `/` suffix stripping to avoid making the root dir reference (`/`) empty. - Do `baseDir` and `subDir` swapping after simplification. Test Plan: Added unittests. Reviewed By: njormrod@fb.com Subscribers: trunkagent, sdwilsh, folly-diffs@ FB internal diff: D1747978 Signature: t1:1747978:1419014942:87f14cb31b8c19b524d7a95b14d63cf5661a8634
-
Tudor Bosman authored
Test Plan: no, it's a comment Reviewed By: zanfur@fb.com Subscribers: folly-diffs@ FB internal diff: D1752850 Tasks: 5823969 Signature: t1:1752850:1419043661:673c68c0daad28b3fde9709e767b528b0dec8ad1
-
Mike Kolupaev authored
Summary: A potential "real life" scenario that maybe can hit this bug is if we erase almost all elements and then iterate over the whole map. Test Plan: Added a test for it. Reviewed By: mwilliams@fb.com Subscribers: folly-diffs@, lovro FB internal diff: D1751455 Tasks: 5866368 Signature: t1:1751455:1419016611:b44c41d348f54397844460cb38002ad0d9704972
-
Giuseppe Ottaviano authored
Summary: D1746899 enforced the constraint (previously in a comment) on the constructor `Range(const Range&, size_t, size_t)` that `Iter` is a `const char*`. There is however no reason for this constraint. This patch generalizes and simplifies the constructor, and since it has the same semantics as `subpiece`, the latter is implemented in terms of the constructor. Test Plan: fbconfig -r folly && fbmake runtests_opt Reviewed By: soren@fb.com Subscribers: trunkagent, folly-diffs@ FB internal diff: D1747958 Signature: t1:1747958:1418930360:fcd6beeda34e64ec8a34b9491a57674ae2265596
-
Dave Watson authored
Summary: This temporary class will be useful to cut dependencies on thrift while (roughly) maintaining the old interface. Fixup various test classes that depend on the interface. Next diff will be to cut fbthrift dep in proxygen/mcrouter Test Plan: unit tests, jenkins Reviewed By: hans@fb.com Subscribers: fbcode-common-diffs@, andrewcox, alandau, bmatheny, alikhtarov, mshneer, trunkagent, doug, njormrod, folly-diffs@, davejwatson FB internal diff: D1696094 Signature: t1:1696094:1418762312:6028815cce2845ac5f8e754132a038fabf5fd957
-
James Sedgwick authored
Summary: We've discussed these a bunch and here they are. I stole a bunch of Hannes' magic from https://www.facebook.com/groups/715931878455430/permalink/772854686096482/ to make this easier Test Plan: added lots of unit tests Reviewed By: hans@fb.com Subscribers: fugalh, folly-diffs@, hannesr FB internal diff: D1748418 Signature: t1:1748418:1418945606:e14c7d6a31245e222bc6a0d259d0e2b9ddd5a830
-
- 18 Dec, 2014 22 commits
-
-
JoelMarcey authored
-
James Sedgwick authored
Summary: Various TARGETS could definitely use some rearranging but I'd rather wait until we're cut over to the new repo Test Plan: wait for contbuild Reviewed By: davejwatson@fb.com Subscribers: ptarjan, joelm, trunkagent, hphp-diffs@, ps, fbcode-common-diffs@, fugalh, alandau, bmatheny, everstore-dev@, mwa, jgehring, fuegen, mshneer, folly-diffs@, hannesr FB internal diff: D1740858 Tasks: 5802833 Signature: t1:1740858:1418752569:4d7d9c5b955e4d9fab4b322cf08a3d285e3db7ce
-
Dave Watson authored
Summary: autotools is fun. rule name has to match Test Plan: No contbuild for this, only a jenkins hourly build: https://ci-builds.fb.com/job/folly/ Reviewed By: noamler@fb.com Subscribers: doug, net-systems@, folly-diffs@ FB internal diff: D1747221 Signature: t1:1747221:1418929497:a29320b5e21a657fe7e0221d2bea8b332626627b
-
Dave Watson authored
Summary: In preparation for a global IOThreadPoolExecutor - we can't override the workerFactory if we are using a global one. Instead, add a new getEventBases() to IOTHreadPoolExecutro and just run code on each eventBase. For shutdown, explicitly add a stop(), instead of doing the work after loop() as exited Cpp2Worker required minor changes to be able to use EventBaseManager's eventbase vs. their own Test Plan: fbconfig -r thrift/lib/cpp2; fbmake runtests Reviewed By: jsedgwick@fb.com Subscribers: trunkagent, andrewcox, doug, fugalh, alandau, bmatheny, mshneer, folly-diffs@ FB internal diff: D1734795 Signature: t1:1734795:1418759367:b45f419e5cbc482a64a5873d9e00e3bcb071db5a
-
Giuseppe Ottaviano authored
Summary: `Range<Iter>` has an implicit constructors from strings for any `Iter`, however such constructors are invalid (compilation fails) if `Iter` is not `[const] char *`. This can be an issue for overload resolution: for example struct IsString { bool operator()(folly::Range<int*>) { return false; } bool operator()(folly::StringPiece) { return true; } }; IsString()(std::string()); fails to compile because the overload is ambiguous, even if the conversion to `ByteRange` is invalid. This patch disables all the invalid constructors from `[const] char*`, `std::string`, and `fbstring`. Test Plan: fbconfig -r folly && fbmake runtests_opt Reviewed By: philipp@fb.com Subscribers: folly-diffs@ FB internal diff: D1746899 Signature: t1:1746899:1418868361:50784c4993df0bd96eeb62c09c659d5e53964d9b
-
James Sedgwick authored
Summary: see attached task. concurrency is hard. Test Plan: stress ran the hell out of it, induced failures before, can't after Reviewed By: hans@fb.com Subscribers: fugalh, folly-diffs@ FB internal diff: D1746879 Tasks: 5589311 Signature: t1:1746879:1418860467:0ec3f51a398eee8a836532770682a4c58758ce93
-
Adam Simpkins authored
Summary: Fix the path to detail/SpinLockImpl.h in Makefile.am Test Plan: Will confirm the Jenkins builds pass for fbthrift and proxygen. Reviewed By: davejwatson@fb.com Subscribers: doug, net-systems@, exa, folly-diffs@ FB internal diff: D1745795 Signature: t1:1745795:1418841636:8a861275a62b018a8181541c7d70ba0890d7129f
-
Laurent Demailly authored
fix bug with elf object left with file open upon error causing Entered fatal signal handler recursively later Summary: fix bug with elf object left with file open upon error causing Entered fatal signal handler recursively later Test Plan: run publisher at the limit Reviewed By: tudorb@fb.com Subscribers: trunkagent, chip, folly-diffs@ FB internal diff: D1743052 Tasks: 5752190 Signature: t1:1743052:1418780889:ad2ee0e6999cf417c2b9fd1ef6bc82d2086774a1
-
Adam Simpkins authored
Summary: This makes several improvements to the SpinLock code: - Add a SpinLock implementation using pthread_spinlock_t. On non-x86_64 platforms this is preferred over the pthread_mutex_t implementation when available. - For the pthread implementations, throw std::system_error on error, rather than completely aborting the program using glog's CHECK() macros. - Update the pthread_mutex_t implementation to call pthread_mutex_destroy() on destruction. - Always unit test all implementations that can be compiled on the current build platform, even though only a single implementation will be selected as folly::SpinLock. This way x86_64 builds will still unit test the pthread-based implementations. Test Plan: Ran the unit tests. Reviewed By: seanc@fb.com Subscribers: trunkagent, doug, net-systems@, exa, folly-diffs@ FB internal diff: D1735770 Signature: t1:1735770:1418445953:b238aa8fb835a8d55e6e98e20c4615ae1938b98f
-
Adam Simpkins authored
Summary: Remove the PortableSpinLock header file now that all call sites have been migrated to the new SpinLock name. Test Plan: Built and ran unit tests for folly, thrift, and proxygen. Reviewed By: seanc@fb.com Subscribers: trunkagent, doug, net-systems@, exa, folly-diffs@ FB internal diff: D1734685 Signature: t1:1734685:1418335405:e834f64d7282393e942a1de3638f4cf67410eaab
-
Adam Simpkins authored
Summary: Update call sites to use the new folly::SpinLock name, instead of folly::io::PortableSpinLock. Test Plan: Built and ran the folly unit tests. Reviewed By: davejwatson@fb.com Subscribers: doug, net-systems@, exa, folly-diffs@ FB internal diff: D1734647 Signature: t1:1734647:1418334925:1bbcffccd06907224de2a102f8d4bfbe1bd62fd1
-
Adam Simpkins authored
Summary: folly::io::PortableSpinLock seems generally useful outside of the io code. This moves it into the base folly namespace, and renames it from PortableSpinLock to just SpinLock. For most users, the main difference between MicroSpinLock and SpinLock is that SpinLock provides a constructor that does the right thing, while MicroSpinLock has to be explicitly initialized. Test Plan: Added some new unit tests, and tested both the MicroSpinLock and pthread_spinlock_t implementations. I didn't test the Mac OS version, although that code remains unchanged. Reviewed By: seanc@fb.com Subscribers: trunkagent, doug, net-systems@, exa, folly-diffs@ FB internal diff: D1734632 Signature: t1:1734632:1418394033:99f6fbe73b485a1d631a2ef7d1b39ea6f49ecb0b
-
Andrii Grynenko authored
Summary: This adds API which makes folly::Singleton as performant as Meyers/static-object singletons. Test Plan: unit test + benchmark ============================================================================ folly/experimental/test/SingletonTest.cpp relative time/iter iters/s ============================================================================ NormalSingleton 333.32ps 3.00G MeyersSingleton 100.00% 333.33ps 3.00G FollySingletonSlow 0.35% 94.36ns 10.60M FollySingletonFast 99.43% 335.24ps 2.98G FollySingletonFastWeak 0.62% 53.74ns 18.61M ============================================================================ Reviewed By: alikhtarov@fb.com Subscribers: trunkagent, folly-diffs@ FB internal diff: D1741961 Signature: t1:1741961:1418765462:d9806f1bf5275bfbe2c4c53a41b735bda93753fe
-
Cameron Pickett authored
Summary: Add a bind api similar to binding by port across all interfaces. However, this bind will only attempt to bind sockets to the supplied IP addresses. I'd like to add this to aid in moving TURN to IPv6. TURN will use two specified addresses, one for IPv4, and one for IPv6, to handle incoming connections from clients. In order to avoid duplicating workers, we'd like to take advantage of the multi-socket implementation of AsyncServerSocket. However, we don't want to bind to all interfaces, especially for port 443. Test Plan: Plan to test by adapting TurnTcpListener to use this new API. See that 1. using one address still works as expected, 2. using zero addesses will cause exception 3. using multiple addresses works as expected Will write unit tests if needed Reviewed By: davejwatson@fb.com Subscribers: hannesr, trunkagent, net-systems@, folly-diffs@, naizhi FB internal diff: D1729442 Tasks: 3633642 Signature: t1:1729442:1418752467:22a60da4ec9009ea0b7fe28a8a436a179e0449aa
-
Nathan Bronson authored
Summary: To handle the strange relationship between steady_clock and system_clock (on some platforms these represent only one type, on some platforms they are separate) Futex::futexWaitUntil converts the deadline to a duration and back. On Xcode 6 system_clock is measured in microseconds and steady_clock in nanoseconds, resulting in a compilation failure. This diff fixes it. Test Plan: 1. compile snippet manually using Xcode 2. new unit test that causes the same implicit conversion failure in a slightly different way Reviewed By: mssarang@fb.com Subscribers: trunkagent, folly-diffs@ FB internal diff: D1740903 Tasks: 5831196 Signature: t1:1740903:1418754770:32c999abf1dc87415ffebf45083a903abbded9f2
-
James Sedgwick authored
Summary: Last thing before moving experimental/wangle here. Once everything is in the same directory I'm probably going to consolidate experimental/wangle/concurrent with the executors in this directory into wangle/executors/. And probably rename some of these targets. For now, a dumb move is enough. Test Plan: waiting for contbuild Reviewed By: davejwatson@fb.com Subscribers: trunkagent, fbcode-common-diffs@, chaoyc, search-fbcode-diffs@, lars, ruibalp, hero-diffs@, zeus-diffs@, vikas, danielg, mcduff, cold-storage-diffs@, unicorn-diffs@, ldbrandy, targeting-diff-backend@, netego-diffs@, fugalh, adamsyta, atlas2-eng@, alandau, bmatheny, adityab, everstore-dev@, zhuohuang, sweeney, mwa, jgehring, smarlow, akr, bnitka, jcoens, luk, zhguo, jying, apodsiadlo, alikhtarov, fuegen, dzhulgakov, mshneer, folly-diffs@, wch, tingy, hannesr FB internal diff: D1740327 Tasks: 5802833 Signature: t1:1740327:1418752541:82d7486293b0a12938730ae66d480c120aded4dc
-
Andrii Grynenko authored
Summary: This removes one layer on locking on the fast path, when ptr to singleton object is read from SingletonEntry. Test Plan: unit test Before: ============================================================================ folly/experimental/test/SingletonTest.cpp relative time/iter iters/s ============================================================================ NormalSingleton 335.26ps 2.98G MeyersSingleton 99.50% 336.96ps 2.97G FollySingleton 0.28% 120.64ns 8.29M ============================================================================ After: ============================================================================ folly/experimental/test/SingletonTest.cpp relative time/iter iters/s ============================================================================ NormalSingleton 336.76ps 2.97G MeyersSingleton 99.91% 337.07ps 2.97G FollySingleton 0.36% 92.69ns 10.79M ============================================================================ Reviewed By: alikhtarov@fb.com Subscribers: trunkagent, folly-diffs@ FB internal diff: D1727604 Signature: t1:1727604:1418701171:1728b516191a8ec4439e981d78634370b4bcf7a1
-
James Sedgwick authored
Summary: This is something we've talked about for a while. It's also an alternative to the mechanism in D1714645. If we like it, I'll do something similar for a global cpu executor. That functionality should probably just be baked into Executor itself instead of a separate subclass, which is why the IOExecutor stuff is in Executor.h/.cpp, because it'll be pretty similar. The main exception is that for getCPUExecutor() you could return a default global InlineExecutor instead of exploding as in getIOExecutor() Test Plan: wangle unit, will start plumbing this into the services in #5003045 if we like it Reviewed By: davejwatson@fb.com Subscribers: hannesr, trunkagent, fugalh, alandau, mshneer, folly-diffs@, bmatheny FB internal diff: D1727894 Tasks: 5002442 Signature: t1:1727894:1418344077:9e54088a6acb3f78e53011a32fd1dfe8b3214c1d
-
James Sedgwick authored
Summary: this removes the dep EventBase has on wangle as we prepare to split off wangle also changes namespace from folly::wangle to folly Test Plan: just a couple of codemods so waiting for contbuild Reviewed By: davejwatson@fb.com Subscribers: trunkagent, fbcode-common-diffs@, chaoyc, search-fbcode-diffs@, zeus-diffs@, nli, cold-storage-diffs@, unicorn-diffs@, targeting-diff-backend@, hannesr, vighnesh, fugalh, alandau, bmatheny, adityab, zhuohuang, luk, darshan, gunjan, hdoshi, dzhulgakov, alihussains, panin, ves, mshneer, folly-diffs@, lins, nimishshah FB internal diff: D1737376 Tasks: 5802833 Signature: t1:1737376:1418423430:82d219c34fcc50218c380a17435e5880e53db6bd
-
Chip Turner authored
Summary: It turned out at least one optimization we were doing for stringPrintf (using the tail of the input buffer) was causing a performance degradation in some cases -- if the string was already pre-sized, our resize() call would end up memset'ing the tail. In some instances, this could cause significant performance penalties, such as when multiple stringAppendf calls were made. So, this diff removes the "optimization" around using the tail of the input buffer and instead uses a standalone stack buffer. If vsnprintf deems that buffer too small, a heap buffer is instead used. As there is no std::string method that resizes the string to fill the underlying buffer without setting the values to a default, and as it is not legal to write past the end of the data buffer (even if capacity() says there is enough), let's just abandon that optimization. It turns out this doesn't have a major performance loss for most cases since, with this diff, most small strings will fit on-stack and then hopefully in the string's tail anyway. Test Plan: runtests Reviewed By: simpkins@fb.com Subscribers: trunkagent, net-systems@, lins, anca, folly-diffs@ FB internal diff: D1733774 Tasks: 5735468 Signature: t1:1733774:1418323943:ec47007c9756aca6cf0466bce92722ac4c7e89b2
-
Andrew Chalfant authored
Summary: While folly has join methods that return a string (and thus don't need a string referenced passed), it does not support this idiom with iterators. This diff adds support for calls like folly::join("/", itr.begin(), itr.end() - 1). Test Plan: Unit test Reviewed By: njormrod@fb.com Subscribers: philipp, trunkagent, njormrod, folly-diffs@, yfeldblum FB internal diff: D1702892 Tasks: 5691439 Signature: t1:1702892:1418344206:9c1736f5d8e41be1df71a415e3803fe846b387b7
-
Dave Watson authored
Summary: Move AsyncUDPSocket to folly. There is also one under realtime/voip/async that looks functionaly equivalent? I think this one is only used in gangplank currently. Test Plan: contbuild Reviewed By: hans@fb.com Subscribers: trunkagent, doug, alandau, bmatheny, njormrod, mshneer, folly-diffs@ FB internal diff: D1710675 Tasks: 5788116 Signature: t1:1710675:1417477000:9aebb466757554a5fa49d7c36cb504b4d8711b68
-