From 1c4738ba866893b3b5c7c9952e9a1bf48e2aa055 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Fri, 24 Apr 2009 09:16:10 +0000 Subject: [PATCH] add missing files (part of #3171 fix) --- includes/RtsGlobals.h | 21 +++++++++++++ rts/Globals.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 includes/RtsGlobals.h create mode 100644 rts/Globals.c diff --git a/includes/RtsGlobals.h b/includes/RtsGlobals.h new file mode 100644 index 0000000..476f112 --- /dev/null +++ b/includes/RtsGlobals.h @@ -0,0 +1,21 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 2006-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. + * + * ---------------------------------------------------------------------------*/ + +#ifndef RTSGLOBALS_H +#define RTSGLOBALS_H + +void initGlobalStore(void); +void exitGlobalStore(void); + +StgStablePtr getOrSetTypeableStore(StgStablePtr value); +StgStablePtr getOrSetSignalHandlerStore(StgStablePtr value); + +#endif diff --git a/rts/Globals.c b/rts/Globals.c new file mode 100644 index 0000000..a0d0788 --- /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; +} -- 1.7.10.4