@@ -107,8 +107,6 @@ FutureFragment::Status AsyncTask::waitFuture(AsyncTask *waitingTask,
107
107
auto queueHead = fragment->waitQueue .load (std::memory_order_acquire);
108
108
bool contextIntialized = false ;
109
109
while (true ) {
110
- concurrency::trace::task_wait (
111
- waitingTask, this , static_cast <uintptr_t >(queueHead.getStatus ()));
112
110
switch (queueHead.getStatus ()) {
113
111
case Status::Error:
114
112
case Status::Success:
@@ -123,6 +121,8 @@ FutureFragment::Status AsyncTask::waitFuture(AsyncTask *waitingTask,
123
121
SWIFT_TASK_DEBUG_LOG (" task %p waiting on task %p, going to sleep" ,
124
122
waitingTask, this );
125
123
_swift_tsan_release (static_cast <Job *>(waitingTask));
124
+ concurrency::trace::task_wait (
125
+ waitingTask, this , static_cast <uintptr_t >(queueHead.getStatus ()));
126
126
// Task is not complete. We'll need to add ourselves to the queue.
127
127
break ;
128
128
}
@@ -233,6 +233,8 @@ void AsyncTask::completeFuture(AsyncContext *context) {
233
233
234
234
_swift_tsan_acquire (static_cast <Job *>(waitingTask));
235
235
236
+ concurrency::trace::task_resume (waitingTask);
237
+
236
238
// Enqueue the waiter on the global executor.
237
239
// TODO: allow waiters to fill in a suggested executor
238
240
waitingTask->flagAsAndEnqueueOnExecutor (ExecutorRef::generic ());
@@ -470,23 +472,27 @@ const void
470
472
reinterpret_cast <void *>(task_future_wait_resume_adapter);
471
473
472
474
const void *AsyncTask::getResumeFunctionForLogging () {
475
+ const void *result = reinterpret_cast <const void *>(ResumeTask);
476
+
473
477
if (ResumeTask == non_future_adapter) {
474
478
auto asyncContextPrefix = reinterpret_cast <AsyncContextPrefix *>(
475
479
reinterpret_cast <char *>(ResumeContext) - sizeof (AsyncContextPrefix));
476
- return reinterpret_cast <const void *>(asyncContextPrefix->asyncEntryPoint );
480
+ result =
481
+ reinterpret_cast <const void *>(asyncContextPrefix->asyncEntryPoint );
477
482
} else if (ResumeTask == future_adapter) {
478
483
auto asyncContextPrefix = reinterpret_cast <FutureAsyncContextPrefix *>(
479
484
reinterpret_cast <char *>(ResumeContext) -
480
485
sizeof (FutureAsyncContextPrefix));
481
- return reinterpret_cast <const void *>(asyncContextPrefix->asyncEntryPoint );
486
+ result =
487
+ reinterpret_cast <const void *>(asyncContextPrefix->asyncEntryPoint );
482
488
} else if (ResumeTask == task_wait_throwing_resume_adapter) {
483
489
auto context = static_cast <TaskFutureWaitAsyncContext *>(ResumeContext);
484
- return reinterpret_cast <const void *>(context->ResumeParent );
490
+ result = reinterpret_cast <const void *>(context->ResumeParent );
485
491
} else if (ResumeTask == task_future_wait_resume_adapter) {
486
- return reinterpret_cast <const void *>(ResumeContext->ResumeParent );
492
+ result = reinterpret_cast <const void *>(ResumeContext->ResumeParent );
487
493
}
488
494
489
- return reinterpret_cast < const void *>(ResumeTask );
495
+ return __ptrauth_swift_runtime_function_entry_strip (result );
490
496
}
491
497
492
498
JobPriority swift::swift_task_currentPriority (AsyncTask *task)
@@ -653,7 +659,7 @@ static AsyncTaskAndContext swift_task_create_commonImpl(
653
659
basePriority = JobPriority::Default;
654
660
}
655
661
656
- SWIFT_TASK_DEBUG_LOG (" Task's base priority = %#x " , basePriority);
662
+ SWIFT_TASK_DEBUG_LOG (" Task's base priority = %#zx " , basePriority);
657
663
658
664
// Figure out the size of the header.
659
665
size_t headerSize = sizeof (AsyncTask);
@@ -788,7 +794,9 @@ static AsyncTaskAndContext swift_task_create_commonImpl(
788
794
futureAsyncContextPrefix->indirectResult = futureFragment->getStoragePtr ();
789
795
}
790
796
791
- SWIFT_TASK_DEBUG_LOG (" creating task %p with parent %p at base pri %zu" , task, parent, basePriority);
797
+ SWIFT_TASK_DEBUG_LOG (" creating task %p ID %" PRIu64
798
+ " with parent %p at base pri %zu" ,
799
+ task, task->getTaskId (), parent, basePriority);
792
800
793
801
// Initialize the task-local allocator.
794
802
initialContext->ResumeParent = reinterpret_cast <TaskContinuationFunction *>(
@@ -1059,6 +1067,8 @@ static AsyncTask *swift_continuation_initImpl(ContinuationAsyncContext *context,
1059
1067
task->ResumeContext = context;
1060
1068
task->ResumeTask = context->ResumeParent ;
1061
1069
1070
+ concurrency::trace::task_continuation_init (task, context);
1071
+
1062
1072
return task;
1063
1073
}
1064
1074
@@ -1071,6 +1081,8 @@ static void swift_continuation_awaitImpl(ContinuationAsyncContext *context) {
1071
1081
assert (task->ResumeTask == context->ResumeParent );
1072
1082
#endif
1073
1083
1084
+ concurrency::trace::task_continuation_await (context);
1085
+
1074
1086
auto &sync = context->AwaitSynchronization ;
1075
1087
1076
1088
auto oldStatus = sync.load (std::memory_order_acquire);
@@ -1157,12 +1169,14 @@ static void resumeTaskAfterContinuation(AsyncTask *task,
1157
1169
SWIFT_CC (swift)
1158
1170
static void swift_continuation_resumeImpl(AsyncTask *task) {
1159
1171
auto context = static_cast <ContinuationAsyncContext*>(task->ResumeContext );
1172
+ concurrency::trace::task_continuation_resume (context, false );
1160
1173
resumeTaskAfterContinuation (task, context);
1161
1174
}
1162
1175
1163
1176
SWIFT_CC (swift)
1164
1177
static void swift_continuation_throwingResumeImpl(AsyncTask *task) {
1165
1178
auto context = static_cast <ContinuationAsyncContext*>(task->ResumeContext );
1179
+ concurrency::trace::task_continuation_resume (context, false );
1166
1180
resumeTaskAfterContinuation (task, context);
1167
1181
}
1168
1182
@@ -1171,6 +1185,7 @@ SWIFT_CC(swift)
1171
1185
static void swift_continuation_throwingResumeWithErrorImpl(AsyncTask *task,
1172
1186
/* +1 */ SwiftError *error) {
1173
1187
auto context = static_cast <ContinuationAsyncContext*>(task->ResumeContext );
1188
+ concurrency::trace::task_continuation_resume (context, true );
1174
1189
context->ErrorResult = error;
1175
1190
resumeTaskAfterContinuation (task, context);
1176
1191
}
0 commit comments