packaged_task::reset() memory allocationSection: 32.10.10.2 [futures.task.members] Status: Resolved Submitter: Jonathan Wakely Opened: 2013-03-05 Last modified: 2017-03-20
Priority: 3
View all other issues in [futures.task.members].
View all issues with Resolved status.
Discussion:
The effects of packaged_task::reset() result in memory allocation, but
don't allow a user to provide an allocator.
packaged_task::reset() needs to be overloaded like so:
template<class Alloc> void reset(const Alloc&);
Alternatively, the effects of reset() need to require the same allocator is used
as at construction, which would require the constructor to store the allocator for later use.
[2015-02 Cologne]
Handed over to SG1.
[2015-05 Lenexa, SG1 response]
No strong opinions in SG1, and this is really an LWG issue. Back to you.
[2016-08-02 Chicago, Billy O'Neal comments and suggests concrete wording]
Talked this over with Alasdair, who says there's little desire to allow the packaged_task to
be change allocators after initial construction, making what libstdc++ does already the "right thing."
A clarification note is still necessary to indicate that the allocator supplied to the
allocator_arg_t constructor is to be used.
Wed PM: Move to Tentatively Ready
[2016-09-08]
Alisdair requests change to Review.
[2017-03-03, Kona]
This was resolved by adopting 2921, which removed the constructors that take allocators.
Proposed resolution:
This wording is relative to N4606
Change 32.10.10.2 [futures.task.members] as indicated:
void reset();-22- Effects:
if the shared state associated with
*thiswas created via thepackaged_task(F&& f)constructor, aAs if*this = packaged_task(std::move(f)), wherefis the task stored in*this.if the shared state associated with
*thiswas created via thepackaged_task(allocator_arg_t, Allocator& a, F&&)constructor, as if*this = packaged_task(allocator_arg, a, std::move(f)), whereais the allocator used to allocate the shared state associated with*this, andfis the task stored in*this.[Note: This constructs a new shared state for
-23- Throws:*this. The old state is abandoned (30.6.4). — end note]
if no allocator was used,
bad_allocif memory for the new shared state could not be allocated.if an allocator was used, any exception thrown by
std::allocator_traits<Allocator>::template rebind_traits<unspecified>::allocate.any exception thrown by the move constructor of the task stored in the shared state.
future_errorwith an error condition ofno_stateif*thishas no shared state.