1. 05 Aug, 2018 7 commits
    • Kenton Varda's avatar
    • Kenton Varda's avatar
      Implement kj::Table, an alternative to STL maps/sets. · 8707e731
      Kenton Varda authored
      Hash-based (unordered) and tree-based (ordered) indexing are provided.
      
      kj::Table offers advantages over STL:
      - A Table can have multiple indexes (allowing lookup by multiple keys). Different indexes can use different algorithms (e.g. hash vs. tree) and have different uniqueness constraints.
      - The properties on which a Table is indexed need not be explicit fields -- they can be computed from the table's row type.
      - Tables use less memory and make fewer allocations than STL, because rows are stored in a contiguous array.
      - The hash indexing implementation uses linear probing rather than chaining, which again means far fewer allocations and more cache-friendliness.
      - The tree indexing implementation uses B-trees optimized for cache line size, whereas STL uses cache-unfriendly and allocation-heavy red-black binary trees. (However, STL trees are overall more cache-friendly; see below.)
      - Most of the b-tree implementation is not templated. This reduces code bloat, at the cost of some performance due to virtual calls.
      
      On an ad hoc benchmark on large tables, the hash index implementation appears to outperform libc++'s `std::unordered_set` by ~60%. However, libc++'s `std::set` still outperforms the B-tree index by ~70%. It looks like the B-tree implementation suffers in part from the fact that keys are not stored inline in the tree nodes, forcing extra memory indirections. This is a price we pay for lower memory usage overall, and the ability to have multiple indexes on one table. The b-tree implementation also suffers somewhat from not being 100% templates, compared to STL, but I think this is a reasonable trade-off. The most performance-critical use cases will use hash indexes anyway.
      8707e731
    • Kenton Varda's avatar
      Update KJ_BIND_METHOD for C++14. · 78c27314
      Kenton Varda authored
      78c27314
    • Kenton Varda's avatar
    • Kenton Varda's avatar
      Extend Tuples to be able to contain references. · 63e28343
      Kenton Varda authored
      You need to use a different constructor function, `refTuple()`, to opt into references. Otherwise, it's too easy to construct a tuple of references by mistake.
      63e28343
    • Kenton Varda's avatar
      Add tuple helpers indexOfType<>() and TypeOfIndex<>. · e92382a4
      Kenton Varda authored
      indexOfType<T, Tuple<...>>() searches the Tuple for a member of type T and returns its index. It fails to compile if there is not exactly one match.
      
      TypeOfIndex<i, Tuple<...>> evaluates to the type of the Tuple member at the given index.
      e92382a4
    • Kenton Varda's avatar
      We now require C++14. · 66730ef6
      Kenton Varda authored
      I'm tired of working around missing features that were added in C++14. It's four years old now, compilers should support it.
      66730ef6
  2. 28 Jul, 2018 1 commit
  3. 20 Jul, 2018 1 commit
    • Oliver Giles's avatar
      Ignore ECHILD in UnixEventPort::ChildSet::checkExits · 4c2796b0
      Oliver Giles authored
      If no child process has changed state, waitpid() returns zero. But if there
      are no more child processes at all, it returns -1 and sets errno to ECHILD.
      Since checkExits calls waitpid() in a loop, it must ignore ECHILD.
      
      +Unit test modified to exhibit the unexpected behaviour.
      4c2796b0
  4. 16 Jul, 2018 6 commits
  5. 15 Jul, 2018 3 commits
  6. 14 Jul, 2018 2 commits
  7. 13 Jul, 2018 1 commit
    • Harris Hancock's avatar
      cmake: Use search-specific-dirs-then-system-dirs idiom · df0fbbe3
      Harris Hancock authored
      An inconsistency was introduced with the previous fix to allow Cap'n Proto
      installations in system directories to be found by CapnProtoTargets.cmake:
      if the user installed Cap'n Proto in two locations, one of which is a
      system directory, e.g. /usr and /somewhere/else, and set
      PKG_CONFIG_PATH=/somewhere/else/lib/pkgconfig, the dependent project
      would use headers from /somewhere/else/include, but libraries from /usr/lib.
      
      This change resolves the inconsistency, allowing PKG_CONFIG_PATH to solely
      control the location of the desired installation of Cap'n Proto.
      df0fbbe3
  8. 30 Jun, 2018 3 commits
  9. 25 Jun, 2018 2 commits
  10. 24 Jun, 2018 2 commits
  11. 21 Jun, 2018 1 commit
  12. 20 Jun, 2018 1 commit
    • Kenton Varda's avatar
      Fix handling of disconnect during WebSocket::pumpTo(). · ce83d192
      Kenton Varda authored
      Before this change, if *either* the `from` or the `to` end of the pump threw a DISCONNECTED exception, we'd then try to call `to.disconnect()`. But if the exception had been thrown from `to` in the first place, then this would throw again, this time complaining about a previous write not having completed. But the whole point was always to propagate errors from the *receiving* end to the sending end. An error on the sending end should just propagate up the stack.
      ce83d192
  13. 13 Jun, 2018 6 commits
  14. 12 Jun, 2018 2 commits
  15. 11 Jun, 2018 2 commits