@@ -279,8 +279,10 @@ class TaskGroupImpl: public TaskGroupTaskStatusRecord {
279279
280280private:
281281
282+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
282283 // TODO: move to lockless via the status atomic (make readyQueue an mpsc_queue_t<ReadyQueueItem>)
283284 mutable std::mutex mutex;
285+ #endif
284286
285287 // / Used for queue management, counting number of waiting and ready tasks
286288 std::atomic <uint64_t > status;
@@ -559,7 +561,9 @@ void TaskGroupImpl::offer(AsyncTask *completedTask, AsyncContext *context) {
559561 assert (completedTask->groupChildFragment ()->getGroup () == asAbstract (this ));
560562 SWIFT_TASK_DEBUG_LOG (" offer task %p to group %p" , completedTask, this );
561563
564+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
562565 mutex.lock (); // TODO: remove fragment lock, and use status for synchronization
566+ #endif
563567
564568 // Immediately increment ready count and acquire the status
565569 // Examples:
@@ -597,7 +601,9 @@ void TaskGroupImpl::offer(AsyncTask *completedTask, AsyncContext *context) {
597601 // Run the task.
598602 auto result = PollResult::get (completedTask, hadErrorResult);
599603
604+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
600605 mutex.unlock (); // TODO: remove fragment lock, and use status for synchronization
606+ #endif
601607
602608 auto waitingContext =
603609 static_cast <TaskFutureWaitAsyncContext *>(
@@ -637,7 +643,9 @@ void TaskGroupImpl::offer(AsyncTask *completedTask, AsyncContext *context) {
637643 assert (completedTask == readyItem.getTask ());
638644 assert (readyItem.getTask ()->isFuture ());
639645 readyQueue.enqueue (readyItem);
646+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
640647 mutex.unlock (); // TODO: remove fragment lock, and use status for synchronization
648+ #endif
641649 return ;
642650}
643651
@@ -722,7 +730,9 @@ static void swift_taskGroup_wait_next_throwingImpl(
722730}
723731
724732PollResult TaskGroupImpl::poll (AsyncTask *waitingTask) {
733+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
725734 mutex.lock (); // TODO: remove group lock, and use status for synchronization
735+ #endif
726736 SWIFT_TASK_DEBUG_LOG (" poll group = %p" , this );
727737 auto assumed = statusMarkWaitingAssumeAcquire ();
728738
@@ -740,7 +750,9 @@ PollResult TaskGroupImpl::poll(AsyncTask *waitingTask) {
740750 statusRemoveWaiting ();
741751 result.status = PollStatus::Empty;
742752 result.successType = this ->successType ;
753+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
743754 mutex.unlock (); // TODO: remove group lock, and use status for synchronization
755+ #endif
744756 return result;
745757 }
746758
@@ -787,7 +799,9 @@ PollResult TaskGroupImpl::poll(AsyncTask *waitingTask) {
787799 result.successType = futureFragment->getResultType ();
788800 assert (result.retainedTask && " polled a task, it must be not null" );
789801 _swift_tsan_acquire (static_cast <Job *>(result.retainedTask ));
802+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
790803 mutex.unlock (); // TODO: remove fragment lock, and use status for synchronization
804+ #endif
791805 return result;
792806
793807 case ReadyStatus::Error:
@@ -798,15 +812,19 @@ PollResult TaskGroupImpl::poll(AsyncTask *waitingTask) {
798812 result.successType = nullptr ;
799813 assert (result.retainedTask && " polled a task, it must be not null" );
800814 _swift_tsan_acquire (static_cast <Job *>(result.retainedTask ));
815+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
801816 mutex.unlock (); // TODO: remove fragment lock, and use status for synchronization
817+ #endif
802818 return result;
803819
804820 case ReadyStatus::Empty:
805821 result.status = PollStatus::Empty;
806822 result.storage = nullptr ;
807823 result.retainedTask = nullptr ;
808824 result.successType = this ->successType ;
825+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
809826 mutex.unlock (); // TODO: remove fragment lock, and use status for synchronization
827+ #endif
810828 return result;
811829 }
812830 assert (false && " must return result when status compare-and-swap was successful" );
@@ -826,7 +844,9 @@ PollResult TaskGroupImpl::poll(AsyncTask *waitingTask) {
826844 waitHead, waitingTask,
827845 /* success*/ std::memory_order_release,
828846 /* failure*/ std::memory_order_acquire)) {
847+ #if !SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
829848 mutex.unlock (); // TODO: remove fragment lock, and use status for synchronization
849+ #endif
830850 // no ready tasks, so we must wait.
831851 result.status = PollStatus::MustWait;
832852 _swift_task_clearCurrent ();
0 commit comments