1. 30 Aug, 2018 16 commits
    • Teng Qin's avatar
      Avoid crash when opening broken file · c07f4bb4
      Teng Qin authored
      Summary:
      In `folly::symbolizer::ElfFile`, we `mmap` the file and access the file content via `mmap`-ed pointer directly. This is nice and efficient, but causes the whole program crashes on `SIGBUS` is the underlying frile is broken.
      
      This Diff changes the first read of the file, for ELF magic number, to use `read` syscall and check return result, instead of accessing the `mmap`-ed pointer directly. This way APIs like `ElfFile::openNoThrow` would return error instead of crashing if the underlying file is broken.
      
      It still doesn't solve the problem if the file becomes broken between we read the ELF magic number and we read file content with the `mmap`-ed file pointer later. But this is the best effort to check for the case with minimal performance cost.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9474328
      
      fbshipit-source-id: 969e0323fcb4011e6a080d914452c9215d2fd13c
      c07f4bb4
    • Xiao Shi's avatar
      disable on android, fix getAllocatedMemorySize test to account for... · c76d6b8c
      Xiao Shi authored
      disable on android, fix getAllocatedMemorySize test to account for implementation-defined bucket_count for default containers
      
      Summary:
      This serves as a mitigation until we look further into the android crashes we
      discovered in android instrumentation tests.
      
      The bucket_count of the default constructed `unordered_map` is
      implementation-defined. This diff takes that into account in the
      `getAllocatedMemorySize` test.
      
      `unordered_map|set` impl in Android NDK does not match the assumptions made in
      `visitAllocationClasses`. Temporarily disable the tests with that method.
      
      Reviewed By: mzlee
      
      Differential Revision: D9578626
      
      fbshipit-source-id: 355940b026f00f783bf65c2f1e10725d5aa920d3
      c76d6b8c
    • Wez Furlong's avatar
      fix apparent typo in fbcode_builder.py · 2d7605b0
      Wez Furlong authored
      Summary:
      I noticed this while testing some changes; the comment
      doesn't seem to match up to the `raise` statement, and attempting
      to throw a list fails in python.
      
      Reviewed By: strager
      
      Differential Revision: D9566018
      
      fbshipit-source-id: 563e43dfd30867993cc2a0f816db3b835a52e6df
      2d7605b0
    • Wez Furlong's avatar
      don't fail if /etc/issue is not present · 30eba07a
      Wez Furlong authored
      Summary:
      When running on macOS there is no /etc/issue.  When running
      with `set -e` enabled, we don't want this to break the build.
      
      Neither of these is possible today, but will be later in this diff stack.
      
      While I'm in here, also print out the cmake version.
      
      Refs: https://github.com/facebook/watchman/pull/639
      
      Reviewed By: snarkmaster
      
      Differential Revision: D9552416
      
      fbshipit-source-id: 432b5b70678908de9f79787d37c3615a7f8649d3
      30eba07a
    • Orvid King's avatar
      Remove support for generating folly-config from autoconf for builds with buck · 2e6381bb
      Orvid King authored
      Summary: Support for building Folly with autoconf is going away; this isn't going to keep working, so remove it.
      
      Reviewed By: yfeldblum, philipjameson
      
      Differential Revision: D9569019
      
      fbshipit-source-id: 1fe99453c741ff9fc8632bbcfdd69df6b1f86d01
      2e6381bb
    • Orvid King's avatar
      Implement the basic operations on sem_t · 4d119477
      Orvid King authored
      Summary: This means that Windows builds no longer require pthreads in order to run tests. (previously we were relying on the pthreads implementation we were using to provide semaphore.h for us)
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9568125
      
      fbshipit-source-id: 712f542c9a29627f72b41e1def2b79d591a33317
      4d119477
    • Orvid King's avatar
      Add support for getpriority and setpriority to the SysResource portability header · c3e09627
      Orvid King authored
      Summary: It's not a perfect mapping, but it's good enough.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9569405
      
      fbshipit-source-id: 7559fb94f8a57717b5a594be0c05a99ac88c6c6e
      c3e09627
    • Orvid King's avatar
      Don't attempt to change the memory limit in the large Retrying test on Windows · a1a6981f
      Orvid King authored
      Summary: The `(get|set)rlimit` stub implementations don't support setting memory limits, and I have no intention of implementing it, so disable it, as there are no meaningful memory limits on Windows to begin with.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9569424
      
      fbshipit-source-id: 738d73f90eb33957ca4a80cb9b3c568034ef141e
      a1a6981f
    • Pádraig Brady's avatar
      folly/FixedString: leverage c++14 to support GCC 8 · 062f62a6
      Pádraig Brady authored
      Summary:
      gcc8 fails compilation with:
          error: taking address of temporary array
            return {+A{Cs..., Char(0)}, sizeof...(Cs)};
      So leverage c++14 to base manipulations on a local array.
      
      Reviewed By: yfeldblum, ericniebler, Orvid
      
      Differential Revision: D9310662
      
      fbshipit-source-id: 0ba375ac0a4cca913e437290bc277c0c6bb8fdc8
      062f62a6
    • Orvid King's avatar
      Escape the escape sequences in CustomLogFormatter · 35312df9
      Orvid King authored
      Summary: These need to be escaped (they also don't work on Windows)
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9566079
      
      fbshipit-source-id: a202673c7cea62f3534ceff9cb81ee84aca65049
      35312df9
    • Orvid King's avatar
      Fix building F14SetTest on platforms where std::array iterators are not just raw char*'s · 8a710957
      Orvid King authored
      Summary: Platforms such as MSVC.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9569093
      
      fbshipit-source-id: 3d836d5f660b610eed47a6692bc0ce33396fbfa5
      8a710957
    • Subodh Iyengar's avatar
      Add mock method for security protocol · ad2a21fb
      Subodh Iyengar authored
      Summary: as title
      
      Reviewed By: Orvid
      
      Differential Revision: D9568603
      
      fbshipit-source-id: b5ce1ba8163af87f3ec6369407e3f8546e80afb1
      ad2a21fb
    • Amir Livneh's avatar
      Temporarily disable F14NodeMap in folly::dynamic for mobile builds · a0011171
      Amir Livneh authored
      Reviewed By: JunqiWang
      
      Differential Revision: D9564136
      
      fbshipit-source-id: 3eeb42e1629fdadfee758c3b9c92e167e126c946
      a0011171
    • Orvid King's avatar
      Define O_CLOEXEC as _O_NOINHERIT · 341c36d7
      Orvid King authored
      Summary: This should work, probably.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9566267
      
      fbshipit-source-id: 052295702a46edd85471c75ca82937dc3a508577
      341c36d7
    • Orvid King's avatar
      Support __builtin_popcountl on Windows · 7350a4b1
      Orvid King authored
      Summary: Because Bits.h feels the need to exercise all variants of popcount.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565298
      
      fbshipit-source-id: 307b3e4a70216c76d63104853e91e36a340ff1ab
      7350a4b1
    • Orvid King's avatar
      Make initializer list construction explicit · f04c4928
      Orvid King authored
      Summary: MSVC wasn't treating this as an initializer list construction, so make it do so.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565470
      
      fbshipit-source-id: 15465b5c87a427920a7cad3f5204bb661ba230c2
      f04c4928
  2. 29 Aug, 2018 13 commits
    • Orvid King's avatar
      Explicitly include <atomic> · 98d33585
      Orvid King authored
      Summary: Because, rather impressively, it wasn't being included transitively by anything here when compiling on Windows.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565417
      
      fbshipit-source-id: b83fa0b121d83cbeb7ff0bd79dec506b6549385e
      98d33585
    • Orvid King's avatar
      Include the SysTime portability header for timeval · 6f2907d7
      Orvid King authored
      Summary: MSVC defines timeval in a weird place, so include the portability header.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9564726
      
      fbshipit-source-id: f9e43225a889bfb0395178ef809aaa81fb9ccc36
      6f2907d7
    • Orvid King's avatar
      Disable a couple more warnings · 39f37772
      Orvid King authored
      Summary: One of these warnings is informational, the other we will continue to blissfully ignore until either includes become cheap, or the eventual heat death of the universe, whichever comes first.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565514
      
      fbshipit-source-id: e5a8d8c868c122d4b06635b061540c8f329ec93d
      39f37772
    • Orvid King's avatar
      Use std::shuffle rather than std::random_shuffle · b0cbeefa
      Orvid King authored
      Summary: Because the latter was removed in C++17, and MSVC no longer supports it.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565195
      
      fbshipit-source-id: 7603ac5280ccf540abec296c7c76a43142581eb3
      b0cbeefa
    • Orvid King's avatar
      Mark a couple of constexpr values as static so they don't need to be captured · f1da3149
      Orvid King authored
      Summary: Because if you tried to capture them, they wouldn't be usable as template arguments.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565384
      
      fbshipit-source-id: 9c4579848be1c5c48251c17b0f55443aade75eba
      f1da3149
    • Orvid King's avatar
      Use std::this_thread::yield() rather than sched_yield() · 7e241566
      Orvid King authored
      Summary: Because the former is standard and the latter doesn't exist on Windows.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565344
      
      fbshipit-source-id: c29c0623c87a20d4c16a29fec1a7311907c1c1cf
      7e241566
    • Orvid King's avatar
      Guard the PThread thread name test with FOLLY_HAVE_PTHREAD · c7c75855
      Orvid King authored
      Summary: Not all platforms have pthread.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565232
      
      fbshipit-source-id: fced220115315f976dbea8c037869cb6aef461fd
      c7c75855
    • Orvid King's avatar
      Disable the secure fork random test on Windows · 78b850be
      Orvid King authored
      Summary: Because forking is not a thing on Windows.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9565259
      
      fbshipit-source-id: 140103d0df3b6d2d70a8e7d4eac96682e3430143
      78b850be
    • Tom Jackson's avatar
      byLine(istream), with partial consumption · 687b7288
      Tom Jackson authored
      Summary:
      Without this, `folly::gen`'s other `byLine()` implementations only
      support a single read pass (usually through the whole input file) without
      support for different formats through the file.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9540396
      
      fbshipit-source-id: 6539851a70aed9a88d3c61986a459f60dfb7be5b
      687b7288
    • Adam Simpkins's avatar
      FileUtil: mark readFull() functions as FOLLY_NODISCARD · ed0a63ed
      Adam Simpkins authored
      Summary:
      Update readFull() and related functions to warn if their return value is
      ignored.  Callers should pretty much always need to examine the return value,
      as they need this to determine how much valid data was read.
      
      Reviewed By: yfeldblum, meyering
      
      Differential Revision: D9526760
      
      fbshipit-source-id: c090044256bfe4bf9907a24ec6090eeae04296b3
      ed0a63ed
    • Adam Simpkins's avatar
      update readFile() to open files with O_CLOEXEC · 4197d896
      Adam Simpkins authored
      Summary:
      Files opened by `readFile()` should not be propagated to children processes
      if another thread happens to spawn a subprocess while `readFile()` is running.
      
      Reviewed By: yfeldblum, meyering
      
      Differential Revision: D9553354
      
      fbshipit-source-id: 2a6028b3a920bb1e76cd0b07f82e6af57d01c2a4
      4197d896
    • Harsh Poddar's avatar
      Added CustomLogFormatter · 397498c3
      Harsh Poddar authored
      Summary:
      A `CustomLogFormatter` can be enabled by setting the `formatter` option to `custom`. This formatter reads an option named `log_format` which specifies the format of the logs. The format string is similar to what `folly::vformat(format,...)` expects. Check out the following example format:
      
        {L}{m:02d}{D:02d} {H:02d}:{M:02d}:{S:02d}.{USECS:06d} {THREAD:5d} {FILE}:{LINE}]
      
      The format above prints logs in the same format as GLOGs.
      
      Another option `colored` takes in one of the following values: `never`, `auto`, and `always`. When enabled, the output will be colored in the following way:
      
      {F135233848}
      
      The config used for the image above is:
        FOLLY_INIT_LOGGING_CONFIG(".=DBG; default:formatter=custom,log_format={L} {FILE}::{FUN}():{LINE}],colored=true");
      
      As you can see, we have also included the function name using `{FUN}`. This can be particularly helpful when debugging errors.
      
      Reviewed By: simpkins
      
      Differential Revision: D8974950
      
      fbshipit-source-id: 87d624f53dd67c0630fb222093c46fe79ff44ee1
      397498c3
    • Xiao Shi's avatar
      use F14NodeMap in folly::dynamic · 5bdd0585
      Xiao Shi authored
      Summary:
      F14NodeMap is a safe drop-in replacement for std::unordered_map. It is smaller
      than std::unordered_map (32 bytes instead of 56 bytes) and has been shown
      to be faster in many production use cases. This diff replaces the hash table
      inside folly::dynamic. The effect is that sizeof(folly::dynamic) will drop from 64
      bytes to 40 bytes, and use cases that use folly::dynamic as an object may also
      get a CPU win.
      
      Reviewed By: nbronson
      
      Differential Revision: D9518110
      
      fbshipit-source-id: 72daba13577c560bbb88c4d68a457afedf1af38e
      5bdd0585
  3. 28 Aug, 2018 11 commits
    • Lewis Baker's avatar
      Add folly::coro::detail::InlineTask · 1f3931f4
      Lewis Baker authored
      Summary:
      Adds a new InlineTask coroutine type that is executor unaware.
      
      *Execution Contexts*
      The InlineTask's coroutine will start execution on the execution context of the coroutine that awaits it. When the InlineTask coroutine awaits something internally, it will resume execution on whatever execution context the operation it awaited on completes on. The coroutine awaiting the InlineTask will be resumed on whatever execution context the operation completed on.
      
      It has been put in the `folly::coro::detail` namespace for now to discourage usage outside of the operators exposed from `folly::coro` as it can be easily misused to accidentally run logic on the wrong execution context.
      
      This type is based around the same design as the `std::experimental::task<T>` that was proposed in [P1056R0](http://wg21.link/P1056R0).
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D9388154
      
      fbshipit-source-id: bc94a9bf07459410ef423b4cfd3b57d13688f744
      1f3931f4
    • Lewis Baker's avatar
      Add folly::coro::blockingWait(awaitable) · a5f943d2
      Lewis Baker authored
      Summary:
      Add a generic function for performing a blocking-wait on any awaitable object.
      
      This obsoletes the use of the `.wait()` and `.get()` methods on  `folly::coro::Future<T>` and so these methods have now been removed.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D9384837
      
      fbshipit-source-id: bcff5b348c024a3fc9337c67d996c447e0723fcc
      a5f943d2
    • Marshall Cline's avatar
      fix contracts for Future::hasValue() & hasException() · 50757e76
      Marshall Cline authored
      Summary:
      * Contract for Future::hasValue() had a typo - fixed that.
      * Contract for Future::hasException() was inconsistent with hasValue() - made it consistent.
      
      Differential Revision: D9527398
      
      fbshipit-source-id: 93e1ebd768fa38476949818c0902e06a7dab5209
      50757e76
    • Matthieu Martin's avatar
      Save python import cost in folly/python get_fiber_manager · 64a6b48f
      Matthieu Martin authored
      Summary:
      Save python import cost in folly/python get_fiber_manager.
      
      In my testing, using call_once here is safe even in multi-threaded and forked environment.
      Though I wouldn't be surprised if a corner case is found in the future, as I couldn't find a definite answer about the safety of memoization Python C-API import calls.
      
      Reviewed By: fried
      
      Differential Revision: D9542909
      
      fbshipit-source-id: c62a08ebf67bd4eb82f1bf4b7657c4a3a6daf4db
      64a6b48f
    • Aaryaman Sagar's avatar
      Make futex functions free functions instead of members · 4d234b99
      Aaryaman Sagar authored
      Summary:
      The current futex API required a reference to a futex object in order to
      invoke `futexWake()`, although this is not buggy by itself, it is technically
      UB and nothing is stopping ASAN from catching this sort of use-after-free and
      reporting it as an error.  Especially when the futex is represented as a
      pointer, requiring a dereference to reach a member function
      
      The bug can come up when you call `futexWake()` on a futex that has been
      destroyed, for example
      
      ```
      auto&& futex_ptr = std::atomic<Futex<>*>{nullptr};
      auto&& thread = std::thread{[&]() {
        auto&& futex = Futex<>{0};
        futex_ptr.store(&futex);
      
        while (futex.load(std::memory_order_relaxed) != 1) {
          futex.futexWait(0);
        }
      }};
      
      while (!futex_ptr.load()) {}
      futex_ptr.load()->store(1);
      futex_ptr.load()->futexWake(1);
      thread.join();
      ```
      
      Here immediately after the `store(1)`, our thread could have loaded the value,
      seen that it had changed, and never went to sleep.  Or it could have seen the
      value as 0, went to sleep and immediately returned when it saw that the value
      in the futex word was not what was expected.
      
      In the scenario described above calling `futexWake()` is done on a "dangling"
      pointer.  To avoid this, we just never dereference the pointer, and pass the
      pointer to the futex syscall, where it will do the right things
      
      A side benefit to the refactor is that adding specializations is very easy.
      And we don't have to mess with member function specializations anymore, which
      are inherently hard to work with (eg. cannot partially specialize)
      
      The ADL extension points (currently implemented for `Futex<std::atomic>`,
      `Futex<DeterministicAtomic>` and `Futex<EmulatedFutexAtomic>`) are
      
      ```
      int futexWakeImpl(FutexType* futex, int count, uint32_t wakeMask);
      
      FutexResult futexWaitImpl(
          FutexType* futex,
          uint32_t expected,
          std::chrono::system_clock::time_point const* absSystemTime,
          std::chrono::steady_clock::time_point const* absSteadyTime,
          uint32_t waitMask);
      ```
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9376527
      
      fbshipit-source-id: bb2b54e511fdf1da992c630a9bc7dc37f76da641
      4d234b99
    • Nick Terrell's avatar
      Add BZIP2 stream codec · 2f002209
      Nick Terrell authored
      Summary:
      Add the BZIP2 stream codec.
      
      The `FlushOp::FLUSH` does not guarantee that the decompressor can read all the input processed so far, due to a bug in the bzip2 library. This is likely not important, since `FLUSH` is not a common operation, especially with bzip2.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9484325
      
      fbshipit-source-id: 40770b6f301a16d86c4de8c2b0875f931f00cba2
      2f002209
    • Xiao Shi's avatar
      restrict NEON version to aarch64 · 8cbbffc3
      Xiao Shi authored
      Summary:
      F14 library relies on the dependent targets to set the neon-related compiler
      flags consistently. As it turns out, this is difficult for non-aarch64
      platforms where neon availability is not guaranteed.
      
      Hence, for safety (so that we don't cause SIGILL on older generation Android
      devices), we restrict the neon version of F14 to aarch64.
      
      Reviewed By: Maratyszcza, nbronson
      
      Differential Revision: D9519198
      
      fbshipit-source-id: cd0c92b17403bce9156a915ad96020f565ca3d6a
      8cbbffc3
    • Dan Melnic's avatar
      Initialize std::atomic<std::thread::id> SingletonHolder::creating_thread_ · e45b48c7
      Dan Melnic authored
      Summary: Initialize `std::atomic<std::thread::id> SingletonHolder::creating_thread_`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9525334
      
      fbshipit-source-id: 93831c40bed21d1f3356bd2181e78ba08b7b116f
      e45b48c7
    • Lewis Baker's avatar
      Add folly::tryEmplaceWith() helper for safely initialising a Try<T> with... · b6c88ec4
      Lewis Baker authored
      Add folly::tryEmplaceWith() helper for safely initialising a Try<T> with result of calling a function
      
      Summary:
      Adds a new folly::tryEmplaceWith() function that is the equivalent of makeTryWith() but for in-place initialisation of an existing Try<T> object.
      
      Using `tryEmplaceWith(t, func)` rather than `t = makeTryWith(func)` can potentially be more exception safe since the latter could potentially still throw if `Try<T>::operator=()` throws (ie. if T's move-constructor can throw).
      
      Updated FiberManager's internals to make use of this to fix a potential exception-safety issue that could have caused a memory leak if the Try<T> move-constructor of the result of fiber threw an exception.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9511067
      
      fbshipit-source-id: 827cc88ea1d4fcd505c8d8a9886b87b26db90544
      b6c88ec4
    • Dan Melnic's avatar
      Fix folly/io/async/test:async_test - AsyncSSLSocketTest.ConnectTFOFallbackTimeout SIGSEGV · cb737bba
      Dan Melnic authored
      Summary: Fix folly/io/async/test:async_test - AsyncSSLSocketTest.ConnectTFOFallbackTimeout SIGSEGV
      
      Reviewed By: djwatson
      
      Differential Revision: D9520104
      
      fbshipit-source-id: c1133bcb0617ca7f8d5f8a9ee46080c7c7f5b105
      cb737bba
    • Lewis Baker's avatar
      Add folly::Try<T>::emplace(), emplaceException() and tryEmplace() · 99cae65e
      Lewis Baker authored
      Summary:
      Add some methods to `folly::Try<T>` to allow the user to in-place construct a value or exception_wrapper inside the Try object at some point after the Try object was constructed.
      
      Previously, you had to construct a new temporary `Try<T>` object from the value and move-assign the value.
      
      The difference between `t.emplace(args...)` and `tryEmplace(t, args...)` is that the latter catches any exceptions thrown by the constructor and stores the exception in the Try object whereas the former lets the exception propagate out to the caller and leaves the Try object in an empty state.
      
      The `Try<void>` implementation now only conditionally constructs the contained exception_wrapper only if hasValue_ is false. This was needed to be able to have the `.emplaceException()` method correctly in-place construct the `exception_wrapper` object.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D9352439
      
      fbshipit-source-id: f34a4479acb2f93aed11f9626b3152511386bfea
      99cae65e