{"url":"https://api.github.com/repos/stlab/stlab/releases/39677016","assets_url":"https://api.github.com/repos/stlab/stlab/releases/39677016/assets","upload_url":"https://uploads.github.com/repos/stlab/stlab/releases/39677016/assets{?name,label}","html_url":"https://github.com/stlab/stlab/releases/tag/v1.6.1","id":39677016,"author":{"login":"sean-parent","id":2279724,"node_id":"MDQ6VXNlcjIyNzk3MjQ=","avatar_url":"https://avatars.githubusercontent.com/u/2279724?v=4","gravatar_id":"","url":"https://api.github.com/users/sean-parent","html_url":"https://github.com/sean-parent","followers_url":"https://api.github.com/users/sean-parent/followers","following_url":"https://api.github.com/users/sean-parent/following{/other_user}","gists_url":"https://api.github.com/users/sean-parent/gists{/gist_id}","starred_url":"https://api.github.com/users/sean-parent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sean-parent/subscriptions","organizations_url":"https://api.github.com/users/sean-parent/orgs","repos_url":"https://api.github.com/users/sean-parent/repos","events_url":"https://api.github.com/users/sean-parent/events{/privacy}","received_events_url":"https://api.github.com/users/sean-parent/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"MDc6UmVsZWFzZTM5Njc3MDE2","tag_name":"v1.6.1","target_commitish":"main","name":"1.6.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2021-03-11T20:11:33Z","updated_at":"2021-03-11T20:12:13Z","published_at":"2021-03-11T20:12:13Z","assets":[],"tarball_url":"https://api.github.com/repos/stlab/stlab/tarball/v1.6.1","zipball_url":"https://api.github.com/repos/stlab/stlab/zipball/v1.6.1","body":"- Simplified the portable default executor to use a priority queue instead of separate queues for each priority\r\n- Simplified logic for blocking_get()\r\n- Added support for blocking_get() to steal tasks when using the portable task system with exponential backoff\r\n- 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.\r\n- 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()`.\r\n- 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.\r\n- 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.\r\n- Made the top-level task invoke actually use universal references and perfect forwarding.\r\n- 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)\r\n- Fixed tasks for objects that require more than maximum alignment.\r\n- Lifted the invoke vtable entry for task into the local task, filling an otherwise empty memory slot (on most architectures).\r\n- 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."}