Skip to content

Commit d78be48

Browse files
committed
[Concurrency] Avoid reinterpret_cast in Concurrency/Task.cpp, fixes crashes in libdispatch
1 parent db94dc7 commit d78be48

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

stdlib/public/Concurrency/Task.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ static const unsigned long dispatchSwiftObjectType = 1;
394394

395395
#if !SWIFT_CONCURRENCY_EMBEDDED
396396

397-
FullMetadata<DispatchClassMetadata> jobHeapMetadata = {
397+
static FullMetadata<DispatchClassMetadata> jobHeapMetadata = {
398398
{
399399
{
400400
/*type layout*/ nullptr,
@@ -433,6 +433,17 @@ static FullMetadata<DispatchClassMetadata> taskHeapMetadata = {
433433
}
434434
};
435435

436+
437+
const void *const swift::_swift_concurrency_debug_jobMetadata =
438+
static_cast<Metadata *>(&jobHeapMetadata);
439+
const void *const swift::_swift_concurrency_debug_asyncTaskMetadata =
440+
static_cast<Metadata *>(&taskHeapMetadata);
441+
442+
const HeapMetadata *swift::jobHeapMetadataPtr =
443+
static_cast<HeapMetadata *>(&jobHeapMetadata);
444+
const HeapMetadata *swift::taskHeapMetadataPtr =
445+
static_cast<HeapMetadata *>(&taskHeapMetadata);
446+
436447
#else // SWIFT_CONCURRENCY_EMBEDDED
437448

438449
// This matches the embedded class metadata layout in IRGen and in
@@ -451,8 +462,6 @@ static EmbeddedClassMetadata taskHeapMetadata = {
451462
0, &destroyTask, 0,
452463
};
453464

454-
#endif
455-
456465
const void *const swift::_swift_concurrency_debug_jobMetadata =
457466
(Metadata *)(&jobHeapMetadata);
458467
const void *const swift::_swift_concurrency_debug_asyncTaskMetadata =
@@ -463,6 +472,8 @@ const HeapMetadata *swift::jobHeapMetadataPtr =
463472
const HeapMetadata *swift::taskHeapMetadataPtr =
464473
(HeapMetadata *)(&taskHeapMetadata);
465474

475+
#endif
476+
466477
static void completeTaskImpl(AsyncTask *task,
467478
AsyncContext *context,
468479
SwiftError *error) {
@@ -986,13 +997,11 @@ swift_task_create_commonImpl(size_t rawTaskCreateFlags,
986997
// Initialize the refcount bits to "immortal", so that
987998
// ARC operations don't have any effect on the task.
988999
task = new (allocation)
989-
AsyncTask(reinterpret_cast<ClassMetadata *>(&taskHeapMetadata),
990-
InlineRefCounts::Immortal, jobFlags, function, initialContext,
991-
captureCurrentVoucher);
992-
} else {
993-
task = new (allocation)
994-
AsyncTask(reinterpret_cast<ClassMetadata *>(&taskHeapMetadata), jobFlags,
1000+
AsyncTask(taskHeapMetadataPtr, InlineRefCounts::Immortal, jobFlags,
9951001
function, initialContext, captureCurrentVoucher);
1002+
} else {
1003+
task = new (allocation) AsyncTask(taskHeapMetadataPtr, jobFlags, function,
1004+
initialContext, captureCurrentVoucher);
9961005
}
9971006

9981007
// Initialize the child fragment if applicable.

0 commit comments

Comments
 (0)