@@ -371,7 +371,7 @@ private:
371371 kj::Maybe<AsyncWaiter&> next;
372372 kj::Maybe<AsyncWaiter&>* prev;
373373
374- static thread_local AsyncWaiter* threadCurrentWaiter;
374+ static const kj::EventLoopLocal< AsyncWaiter*> threadCurrentWaiter;
375375
376376 friend class Worker ::Isolate;
377377 friend class Worker ::AsyncLock;
@@ -2228,7 +2228,7 @@ void Worker::Lock::validateHandlers(ValidationErrorReporter& errorReporter) {
22282228// =======================================================================================
22292229// AsyncLock implementation
22302230
2231- thread_local Worker::AsyncWaiter* Worker::AsyncWaiter::threadCurrentWaiter = nullptr ;
2231+ const kj::EventLoopLocal< Worker::AsyncWaiter*> Worker::AsyncWaiter::threadCurrentWaiter;
22322232
22332233Worker::Isolate::AsyncWaiterList::~AsyncWaiterList () noexcept {
22342234 // It should be impossible for this list to be non-empty since each member of the list holds a
@@ -2257,7 +2257,7 @@ kj::Promise<Worker::AsyncLock> Worker::Isolate::takeAsyncLockImpl(
22572257 }
22582258
22592259 for (uint threadWaitingDifferentLockCount = 0 ;; ++threadWaitingDifferentLockCount) {
2260- AsyncWaiter* waiter = AsyncWaiter::threadCurrentWaiter;
2260+ AsyncWaiter* waiter = * AsyncWaiter::threadCurrentWaiter;
22612261
22622262 if (waiter == nullptr ) {
22632263 // Thread is not currently waiting on a lock.
@@ -2327,7 +2327,7 @@ Worker::AsyncWaiter::AsyncWaiter(kj::Own<const Isolate> isolateParam)
23272327 *lock->tail = this ;
23282328 lock->tail = &next;
23292329
2330- threadCurrentWaiter = this ;
2330+ * threadCurrentWaiter = this ;
23312331
23322332 __atomic_add_fetch (&isolate->impl ->lockAttemptGauge , 1 , __ATOMIC_RELAXED);
23332333}
@@ -2358,20 +2358,22 @@ Worker::AsyncWaiter::~AsyncWaiter() noexcept {
23582358 }
23592359 }
23602360
2361- KJ_ASSERT (threadCurrentWaiter == this );
2362- threadCurrentWaiter = nullptr ;
2361+ auto & w = *threadCurrentWaiter;
2362+ KJ_ASSERT (w == this );
2363+ w = nullptr ;
23632364}
23642365
23652366kj::Promise<void > Worker::AsyncLock::whenThreadIdle () {
2367+ AsyncWaiter*& currentWaiter = *AsyncWaiter::threadCurrentWaiter;
23662368 for (;;) {
2367- if (auto waiter = AsyncWaiter::threadCurrentWaiter; waiter != nullptr ) {
2368- co_await waiter ->releasePromise ;
2369+ if (currentWaiter != nullptr ) {
2370+ co_await currentWaiter ->releasePromise ;
23692371 continue ;
23702372 }
23712373
23722374 co_await kj::yieldUntilQueueEmpty ();
23732375
2374- if (AsyncWaiter::threadCurrentWaiter == nullptr ) {
2376+ if (currentWaiter == nullptr ) {
23752377 co_return ;
23762378 }
23772379 // Whoops, a new lock attempt appeared, loop.
0 commit comments