diff options
author | Simon Marlow <marlowsd@gmail.com> | 2009-04-24 09:16:10 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2009-04-24 09:16:10 +0000 |
commit | 1c4738ba866893b3b5c7c9952e9a1bf48e2aa055 (patch) | |
tree | 34cd2475aafa22292899812171f460f3a5ff8ea0 /rts/Globals.c | |
parent | 980a3e89be93e2d40cc26ca626c8cbf293abb78c (diff) | |
download | haskell-1c4738ba866893b3b5c7c9952e9a1bf48e2aa055.tar.gz |
add missing files (part of #3171 fix)
Diffstat (limited to 'rts/Globals.c')
-rw-r--r-- | rts/Globals.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/rts/Globals.c b/rts/Globals.c new file mode 100644 index 0000000000..a0d0788335 --- /dev/null +++ b/rts/Globals.c @@ -0,0 +1,84 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 1995-2009 + * + * The RTS stores some "global" values on behalf of libraries, so that + * some libraries can ensure that certain top-level things are shared + * even when multiple versions of the library are loaded. e.g. see + * Data.Typeable and GHC.Conc. + * + * ---------------------------------------------------------------------------*/ + +#include "Rts.h" +#include "RtsGlobals.h" + +static StgStablePtr typeableStore = 0; +static StgStablePtr signalHandlerStore = 0; + +#ifdef THREADED_RTS +Mutex globalStoreLock; +#endif + +void +initGlobalStore(void) +{ + typeableStore = 0; + signalHandlerStore = 0; +#ifdef THREADED_RTS + initMutex(&globalStoreLock); +#endif +} + +void +exitGlobalStore(void) +{ +#ifdef THREADED_RTS + closeMutex(&globalStoreLock); +#endif + if(typeableStore!=0) { + freeStablePtr((StgStablePtr)typeableStore); + typeableStore=0; + } + if(signalHandlerStore!=0) { + freeStablePtr((StgStablePtr)signalHandlerStore); + signalHandlerStore=0; + } +} + +StgStablePtr +getOrSetTypeableStore(StgStablePtr ptr) +{ + StgStablePtr ret = typeableStore; + if(ret==0) { +#ifdef THREADED_RTS + ACQUIRE_LOCK(&globalStoreLock); + ret=typeableStore; + if(ret==0) { +#endif + typeableStore = ret = ptr; +#ifdef THREADED_RTS + } + RELEASE_LOCK(&globalStoreLock); +#endif + } + return ret; +} + +StgStablePtr +getOrSetSignalHandlerStore(StgStablePtr ptr) +{ + StgStablePtr ret = signalHandlerStore; + if(ret==0) { +#ifdef THREADED_RTS + ACQUIRE_LOCK(&globalStoreLock); + ret=signalHandlerStore; + if(ret==0) { +#endif + signalHandlerStore = ret = ptr; +#ifdef THREADED_RTS + } + RELEASE_LOCK(&globalStoreLock); +#endif + } + return ret; +} |