3131#include " swift/Basic/STLExtras.h"
3232#include " swift/Runtime/Concurrency.h"
3333#include " swift/Runtime/Config.h"
34+ #include " swift/Runtime/Heap.h"
3435#include " swift/Runtime/HeapObject.h"
3536#include " swift/Threading/Mutex.h"
3637#include < atomic>
38+ #include < deque>
3739#include < new>
3840
3941#if SWIFT_STDLIB_HAS_ASL
@@ -114,7 +116,7 @@ class DiscardingTaskGroup;
114116
115117template <typename T>
116118class NaiveTaskGroupQueue {
117- std::queue <T > queue;
119+ std::queue<T, std::deque<T, swift::cxx_allocator<T>> > queue;
118120
119121public:
120122 NaiveTaskGroupQueue () = default ;
@@ -346,6 +348,11 @@ class TaskGroupBase : public TaskGroupTaskStatusRecord {
346348public:
347349 virtual ~TaskGroupBase () {}
348350
351+ // / Because we have a virtual destructor, we need to declare a delete operator
352+ // / here, otherwise the compiler will generate a deleting destructor that
353+ // / calls ::operator delete.
354+ SWIFT_CXX_DELETE_OPERATOR (TaskGroupBase)
355+
349356 TaskStatusRecordKind getKind () const {
350357 return Flags.getKind ();
351358 }
@@ -419,7 +426,9 @@ class TaskGroupBase : public TaskGroupTaskStatusRecord {
419426 TaskGroupStatus statusLoadRelaxed () const ;
420427 TaskGroupStatus statusLoadAcquire () const ;
421428
429+ #if !SWIFT_CONCURRENCY_EMBEDDED
422430 std::string statusString () const ;
431+ #endif
423432
424433 bool isEmpty () const ;
425434
@@ -469,6 +478,7 @@ class TaskGroupBase : public TaskGroupTaskStatusRecord {
469478
470479};
471480
481+ #if !SWIFT_CONCURRENCY_EMBEDDED
472482[[maybe_unused]]
473483static std::string to_string (TaskGroupBase::PollStatus status) {
474484 switch (status) {
@@ -478,6 +488,7 @@ static std::string to_string(TaskGroupBase::PollStatus status) {
478488 case TaskGroupBase::PollStatus::Error: return " Error" ;
479489 }
480490}
491+ #endif
481492
482493// / The status of a task group.
483494// /
@@ -579,7 +590,13 @@ struct TaskGroupStatus {
579590 swift_asprintf (
580591 &message,
581592 " error: %sTaskGroup: detected pending task count overflow, in task group %p! Status: %s" ,
582- group->isDiscardingResults () ? " Discarding" : " " , group, status.to_string (group).c_str ());
593+ group->isDiscardingResults () ? " Discarding" : " " , group,
594+ #if !SWIFT_CONCURRENCY_EMBEDDED
595+ status.to_string (group).c_str ()
596+ #else
597+ " <status unavailable in embedded>"
598+ #endif
599+ );
583600
584601#if !SWIFT_CONCURRENCY_EMBEDDED
585602 if (_swift_shouldReportFatalErrorsToDebugger ()) {
@@ -612,6 +629,7 @@ struct TaskGroupStatus {
612629 abort ();
613630 }
614631
632+ #if !SWIFT_CONCURRENCY_EMBEDDED
615633 // / Pretty prints the status, as follows:
616634 // / If accumulating results:
617635 // / TaskGroupStatus{ C:{cancelled} W:{waiting task} R:{ready tasks} P:{pending tasks} {binary repr} }
@@ -634,6 +652,7 @@ struct TaskGroupStatus {
634652 str.append (" }" );
635653 return str;
636654 }
655+ #endif // !SWIFT_CONCURRENCY_EMBEDDED
637656
638657 // / Initially there are no waiting and no pending tasks.
639658 static const TaskGroupStatus initial () {
@@ -691,9 +710,11 @@ TaskGroupStatus TaskGroupBase::statusLoadAcquire() const {
691710 return TaskGroupStatus{status.load (std::memory_order_acquire)};
692711}
693712
713+ #if !SWIFT_CONCURRENCY_EMBEDDED
694714std::string TaskGroupBase::statusString () const {
695715 return statusLoadRelaxed ().to_string (this );
696716}
717+ #endif
697718
698719bool TaskGroupBase::isEmpty () const {
699720 auto oldStatus = TaskGroupStatus{status.load (std::memory_order_relaxed)};
@@ -749,6 +770,7 @@ TaskGroupStatus TaskGroupBase::statusAddPendingTaskAssumeRelaxed(bool unconditio
749770 }
750771
751772 SWIFT_TASK_GROUP_DEBUG_LOG (this , " addPending, after: %s" , s.to_string (this ).c_str ());
773+
752774 return s;
753775}
754776
@@ -967,13 +989,13 @@ static void swift_taskGroup_initializeImpl(TaskGroup *group, const Metadata *T)
967989SWIFT_CC (swift)
968990static void swift_taskGroup_initializeWithFlagsImpl(size_t rawGroupFlags,
969991 TaskGroup *group, const Metadata *T) {
970- ResultTypeInfo resultType;
971992#if !SWIFT_CONCURRENCY_EMBEDDED
993+ ResultTypeInfo resultType;
972994 resultType.metadata = T;
995+ _swift_taskGroup_initialize (resultType, rawGroupFlags, group);
973996#else
974997 swift_unreachable (" swift_taskGroup_initializeWithFlags in embedded" );
975998#endif
976- _swift_taskGroup_initialize (resultType, rawGroupFlags, group);
977999}
9781000
9791001// Initializes into the preallocated _group an actual instance.
0 commit comments