diff --git a/stdlib/public/Concurrency/GlobalExecutor.cpp b/stdlib/public/Concurrency/GlobalExecutor.cpp index a725d3c6f13f4..d2d9923cb8b22 100644 --- a/stdlib/public/Concurrency/GlobalExecutor.cpp +++ b/stdlib/public/Concurrency/GlobalExecutor.cpp @@ -335,6 +335,8 @@ static void swift_task_enqueueGlobalImpl(Job *job) { } void swift::swift_task_enqueueGlobal(Job *job) { + _swift_tsan_release(job); + if (swift_task_enqueueGlobal_hook) swift_task_enqueueGlobal_hook(job, swift_task_enqueueGlobalImpl); else diff --git a/stdlib/public/Concurrency/Task.cpp b/stdlib/public/Concurrency/Task.cpp index d40895c6720bd..6c00f5e26d619 100644 --- a/stdlib/public/Concurrency/Task.cpp +++ b/stdlib/public/Concurrency/Task.cpp @@ -950,7 +950,7 @@ static void resumeTaskAfterContinuation(AsyncTask *task, // Make sure TSan knows that the resume call happens-before the task // restarting. - _swift_tsan_release(task); + _swift_tsan_release(static_cast(task)); // The status should be either Pending or Awaited. If it's Awaited, // which is probably the most likely option, then we should immediately diff --git a/stdlib/public/Concurrency/ThreadSanitizer.cpp b/stdlib/public/Concurrency/ThreadSanitizer.cpp index 336c35ff8535d..b28742a3644b9 100644 --- a/stdlib/public/Concurrency/ThreadSanitizer.cpp +++ b/stdlib/public/Concurrency/ThreadSanitizer.cpp @@ -31,12 +31,18 @@ TSanFunc *tsan_acquire, *tsan_release; void swift::_swift_tsan_acquire(void *addr) { if (tsan_acquire) { tsan_acquire(addr); +#if SWIFT_TASK_PRINTF_DEBUG + fprintf(stderr, "[%lu] tsan_acquire on %p\n", _swift_get_thread_id(), addr); +#endif } } void swift::_swift_tsan_release(void *addr) { if (tsan_release) { tsan_release(addr); +#if SWIFT_TASK_PRINTF_DEBUG + fprintf(stderr, "[%lu] tsan_release on %p\n", _swift_get_thread_id(), addr); +#endif } } diff --git a/test/Concurrency/Runtime/actor_counters.swift b/test/Concurrency/Runtime/actor_counters.swift index d483726161a54..44ed1aeaa4fd5 100644 --- a/test/Concurrency/Runtime/actor_counters.swift +++ b/test/Concurrency/Runtime/actor_counters.swift @@ -28,6 +28,12 @@ actor Counter { value = value + 1 return current } + + deinit { + for i in 0..