/*** Copyright (C) Jamie Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuStopTheWorld.cpp Date: 2024-09-09 Author: Reece ***/ #include #include "AuStopTheWorld.hpp" #include "AuWakeOnAddress.hpp" #include "Primitives/SMTYield.hpp" namespace Aurora::Threading { static AuThreadPrimitives::RWLock gHolderRWLock; AUKN_SYM IWaitable *GetShutdownReadLock() { return gHolderRWLock->AsReadable(); } void WakeOnAddressHoldContainersAndTheWorld(const AuVoidFunc &func) { // We * must * allow ::GetShutdownLock() to be recursive, no matter how the runtime is configured Primitives::ThrdCfg::gEnableRWLockWriteBiasOnReadLock = false; { // First: no-one shall pass anymore AU_LOCK_GUARD(gHolderRWLock->AsWritable()); // Second: wait for any sleep ops to finish for (AU_ITERATE_N(i, kDefaultWaitPerProcess)) { gProcessWaitables.list[i].Lock(); } { func(); } // Finally: reset for (AU_ITERATE_N(i, kDefaultWaitPerProcess)) { gProcessWaitables.list[i].Unlock(); } } Primitives::ThrdCfg::gEnableRWLockWriteBiasOnReadLock = gRuntimeConfig.threadingConfig.bEnableRWLockWriteBiasOnReadLock; } }