diff --git a/stdlib/public/Concurrency/GlobalExecutor.cpp b/stdlib/public/Concurrency/GlobalExecutor.cpp index 9beca3c71ef0a..5fbdec4ac9f23 100644 --- a/stdlib/public/Concurrency/GlobalExecutor.cpp +++ b/stdlib/public/Concurrency/GlobalExecutor.cpp @@ -336,6 +336,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 34e08fcee75dc..2b6e839bd821d 100644 --- a/stdlib/public/Concurrency/Task.cpp +++ b/stdlib/public/Concurrency/Task.cpp @@ -914,7 +914,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..