Skip to content

Commit e2d2ca0

Browse files
authored
waitQueue.compare_exchange_strong in the true loop can be weak (#70636)
1 parent 7365f9f commit e2d2ca0

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

stdlib/public/Concurrency/TaskGroup.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,14 +1779,14 @@ reevaluate_if_taskgroup_has_results:;
17791779
// ==== 3) Add to wait queue -------------------------------------------------
17801780
assert(assumed.readyTasks(this) == 0);
17811781
_swift_tsan_release(static_cast<Job *>(waitingTask));
1782+
if (!hasSuspended) {
1783+
waitingTask->flagAsSuspendedOnTaskGroup(asAbstract(this));
1784+
hasSuspended = true;
1785+
}
17821786
while (true) {
1783-
if (!hasSuspended) {
1784-
hasSuspended = true;
1785-
waitingTask->flagAsSuspendedOnTaskGroup(asAbstract(this));
1786-
}
17871787
// Put the waiting task at the beginning of the wait queue.
17881788
SWIFT_TASK_GROUP_DEBUG_LOG(this, "WATCH OUT, SET WAITER ONTO waitQueue.head = %p", waitQueue.load(std::memory_order_relaxed));
1789-
if (waitQueue.compare_exchange_strong(
1789+
if (waitQueue.compare_exchange_weak(
17901790
waitHead, waitingTask,
17911791
/*success*/ std::memory_order_release,
17921792
/*failure*/ std::memory_order_acquire)) {
@@ -1941,13 +1941,13 @@ void TaskGroupBase::waitAll(SwiftError* bodyError, AsyncTask *waitingTask,
19411941

19421942
auto waitHead = waitQueue.load(std::memory_order_acquire);
19431943
_swift_tsan_release(static_cast<Job *>(waitingTask));
1944+
if (!hasSuspended) {
1945+
waitingTask->flagAsSuspendedOnTaskGroup(asAbstract(this));
1946+
hasSuspended = true;
1947+
}
19441948
while (true) {
1945-
if (!hasSuspended) {
1946-
hasSuspended = true;
1947-
waitingTask->flagAsSuspendedOnTaskGroup(asAbstract(this));
1948-
}
19491949
// Put the waiting task at the beginning of the wait queue.
1950-
if (waitQueue.compare_exchange_strong(
1950+
if (waitQueue.compare_exchange_weak(
19511951
waitHead, waitingTask,
19521952
/*success*/ std::memory_order_release,
19531953
/*failure*/ std::memory_order_acquire)) {

0 commit comments

Comments
 (0)