summaryrefslogtreecommitdiff
path: root/rts/Globals.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-04-24 09:16:10 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-04-24 09:16:10 +0000
commit1c4738ba866893b3b5c7c9952e9a1bf48e2aa055 (patch)
tree34cd2475aafa22292899812171f460f3a5ff8ea0 /rts/Globals.c
parent980a3e89be93e2d40cc26ca626c8cbf293abb78c (diff)
downloadhaskell-1c4738ba866893b3b5c7c9952e9a1bf48e2aa055.tar.gz
add missing files (part of #3171 fix)
Diffstat (limited to 'rts/Globals.c')
-rw-r--r--rts/Globals.c84
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;
+}