1f22fc995a
When using move-only types, continuations args are set using takeResult function, which has the side effect of invalidating the QFutureInterface associated with the promise/futures by: 1. setting isValid to false 2. setting the state to NoState And when the promise is destroyed, it tries to run the continuations if `finished()` is not called, which is done by checking the Finished bit in the state. But since the continuation has been run before, and the state has been set to NoState it tries to run the continuation again causing a segfault. Multiple solutions come in mind: 1. don't run the continuation if the state is NoState, but this would break the case when an empty promise is destroyed 2. check inside the continuation if it has been run before, and if so don't run it again, but this seems hacky since we don't want the continuation to be run twice, and it should break if it did. 3. when invalidating the promise leave the state as is, and change isValid only to false, which changes the current behavior, but is still compatible with the documentation which states only that isValid will return false if takeResult is called I chose option 3 I also extended some tests to test for move only types, and added a test that continuations run when a promise is finished. This simple case would segfault before with move only types. Fixes: QTBUG-112513 Pick-to: 6.5 6.6 Change-Id: Ie225ac4fdf618e4edfb0efd663d6c7fd6b916dbd Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> |
||
---|---|---|
.. | ||
qatomicint | ||
qatomicinteger | ||
qatomicpointer | ||
qfuture | ||
qfuturesynchronizer | ||
qfuturewatcher | ||
qmutex | ||
qmutexlocker | ||
qpromise | ||
qreadlocker | ||
qreadwritelock | ||
qresultstore | ||
qsemaphore | ||
qthread | ||
qthreadonce | ||
qthreadpool | ||
qthreadstorage | ||
qwaitcondition | ||
qwritelocker | ||
CMakeLists.txt |