1. 17 Feb, 2015 14 commits
  2. 16 Feb, 2015 9 commits
  3. 15 Feb, 2015 1 commit
  4. 13 Feb, 2015 5 commits
    • Dominik Charousset's avatar
      Optimize forwarding of messages · 1fa62d11
      Dominik Charousset authored
      When forwarding a message, an actor transfers ownership of its current
      `mailbox_element` to the receiver. Combined with the previous optimization,
      this means that there is only a single memory allocation for a message from
      source to destination.
      1fa62d11
    • Dominik Charousset's avatar
      Implement `fast_send`, reducing memory allocations · 5c7af235
      Dominik Charousset authored
      Whenever an actor calls `send(dest, v1, v2, ...)`, we previously allocated a
      `mailbox_element` and a `message` object. The `fast_send` optimization joins
      both objects into a single one using `pair_storage`:
      
      ```
      pair_storage<mailbox_element, tuple_vals<Ts...>>:
      
          /-----------------------------------------------\
          |                                               |
          |     /------------\                            |
          |     |            | intrusive_ptr              | intrusive_ptr
          v     v            |                            |
      +------------+-------------------+---------------------+
      |  refcount  |  mailbox_element  |  tuple_vals<Ts...>  |
      +------------+-------------------+---------------------+
                            ^                   ^
                            |                   |
                 unique_ptr<mailbox_element,    |
                            detail::disposer>   |
                                                |
                                                |
                                   intrusive_ptr<message_data>
      ```
      
      Since each element in `pair_storage` lives inside a `union`, it is safe to
      simply call the destructor for each element in `request_deletion`. This is done
      by extending both types and override `request_deletion` accordingly (see
      `detail::embedded`).  The only additional safety measure we need to take is to
      make sure to swap the `intrusive_ptr` out of each element *before* calling the
      destructor. This way, the destruct is guaranteed to be done before we attempt
      to release the storage.
      5c7af235
    • Dominik Charousset's avatar
      ade02937
    • Dominik Charousset's avatar
      963a0bc8
    • Dominik Charousset's avatar
      96a251b3
  5. 12 Feb, 2015 3 commits
  6. 11 Feb, 2015 4 commits
  7. 10 Feb, 2015 4 commits