add missing files (part of #3171 fix)
authorSimon Marlow <marlowsd@gmail.com>
Fri, 24 Apr 2009 09:16:10 +0000 (09:16 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 24 Apr 2009 09:16:10 +0000 (09:16 +0000)
includes/RtsGlobals.h [new file with mode: 0644]
rts/Globals.c [new file with mode: 0644]

diff --git a/includes/RtsGlobals.h b/includes/RtsGlobals.h
new file mode 100644 (file)
index 0000000..476f112
--- /dev/null
@@ -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 (file)
index 0000000..a0d0788
--- /dev/null
@@ -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;
+}