--- /dev/null
+/* -----------------------------------------------------------------------------
+ *
+ * (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
--- /dev/null
+/* -----------------------------------------------------------------------------
+ *
+ * (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;
+}