Skip to content

1.6.1

Compare
Choose a tag to compare
@sean-parent sean-parent released this 11 Mar 20:12
· 139 commits to main since this release
a339365
  • Simplified the portable default executor to use a priority queue instead of separate queues for each priority
  • Simplified logic for blocking_get()
  • Added support for blocking_get() to steal tasks when using the portable task system with exponential backoff
  • Fixed a bug where setting the exception on a promise does not resolve the promise, and so subsequent destruction of the promise would change the exception to a broken_promise.
  • Fixed two places where objects captured by lambdas were subsequently moved, but the lambdas were not marked as mutable. This meant that you could not move a future passed to recover().
  • Disabled the task() template constructor in the case where the passed function was a task so that it doesn't match the copy constructor. Previously if you copied a task it would compile, but infinitely recurse when executed. Now copying a task will not compile.
  • Fixed an issue where the task invoke arguments where always getting declared as rvalues (I think someone tried to make them universal references) - added a comment to avoid the mistake in the future.
  • Made the top-level task invoke actually use universal references and perfect forwarding.
  • Reduced the size of task for small object optimization (now will usually be size of 8 pointers, with 6 pointers of space for the small object)
  • Fixed tasks for objects that require more than maximum alignment.
  • Lifted the invoke vtable entry for task into the local task, filling an otherwise empty memory slot (on most architectures).
  • Removed the move() on the invoke calls in task, these were intended to make all tasks single execution, but many are not, and so this is a slightly dangerous and, as far as I know, unused optimization. If needed it could come back as a new virtual (rvalue invoke) call and only be used with the task actually is an rvalue.