Add shared Typeable support
authorEsa Ilari Vuokko <ei@vuokko.info>
Wed, 23 Aug 2006 00:30:41 +0000 (00:30 +0000)
committerEsa Ilari Vuokko <ei@vuokko.info>
Wed, 23 Aug 2006 00:30:41 +0000 (00:30 +0000)
includes/RtsTypeable.h [new file with mode: 0644]
rts/Linker.c
rts/RtsStartup.c
rts/Typeable.c [new file with mode: 0644]

diff --git a/includes/RtsTypeable.h b/includes/RtsTypeable.h
new file mode 100644 (file)
index 0000000..28b59cd
--- /dev/null
@@ -0,0 +1,19 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 2006
+ *
+ *  Support for shared Typeable
+ *
+ * ---------------------------------------------------------------------------*/\r
+\r
+#ifndef GHC_RTS_TYPEABLE_H\r
+#define GHC_RTS_TYPEABLE_H\r
+\r
+#include "Stg.h"\r
+\r
+void initTypeableStore(void);\r
+void exitTypeableStore(void);\r
+\r
+StgPtr getOrSetTypeableStore(StgPtr);\r
+\r
+#endif\r
index 2c9b07e..933f4dd 100644 (file)
@@ -27,6 +27,7 @@
 #include "Schedule.h"
 #include "Storage.h"
 #include "Sparks.h"
 #include "Schedule.h"
 #include "Storage.h"
 #include "Sparks.h"
+#include "RtsTypeable.h"
 
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
@@ -508,6 +509,7 @@ typedef struct _RtsSymbolVal {
       SymX(forkOS_createThread)                        \
       SymX(freeHaskellFunctionPtr)             \
       SymX(freeStablePtr)                      \
       SymX(forkOS_createThread)                        \
       SymX(freeHaskellFunctionPtr)             \
       SymX(freeStablePtr)                      \
+      SymX(getOrSetTypeableStore)              \
       SymX(gcdIntegerzh_fast)                  \
       SymX(gcdIntegerIntzh_fast)               \
       SymX(gcdIntzh_fast)                      \
       SymX(gcdIntegerzh_fast)                  \
       SymX(gcdIntegerIntzh_fast)               \
       SymX(gcdIntzh_fast)                      \
index 3fef259..2deb3d8 100644 (file)
@@ -28,6 +28,7 @@
 #include "ThreadLabels.h"
 #include "BlockAlloc.h"
 #include "Trace.h"
 #include "ThreadLabels.h"
 #include "BlockAlloc.h"
 #include "Trace.h"
+#include "RtsTypeable.h"
 
 #if defined(RTS_GTK_FRONTPANEL)
 #include "FrontPanel.h"
 
 #if defined(RTS_GTK_FRONTPANEL)
 #include "FrontPanel.h"
@@ -196,6 +197,9 @@ hs_init(int *argc, char **argv[])
     /* initialise the stable pointer table */
     initStablePtrTable();
 
     /* initialise the stable pointer table */
     initStablePtrTable();
 
+    /* initialise the shared Typeable store */
+    initTypeableStore();
+
 #if defined(DEBUG)
     /* initialise thread label table (tso->char*) */
     initThreadLabelTable();
 #if defined(DEBUG)
     /* initialise thread label table (tso->char*) */
     initThreadLabelTable();
@@ -390,6 +394,9 @@ hs_exit(void)
     // also outputs the stats (+RTS -s) info.
     exitStorage();
     
     // also outputs the stats (+RTS -s) info.
     exitStorage();
     
+    /* free shared Typeable store */
+    exitTypeableStore();
+
     /* initialise the stable pointer table */
     exitStablePtrTable();
 
     /* initialise the stable pointer table */
     exitStablePtrTable();
 
diff --git a/rts/Typeable.c b/rts/Typeable.c
new file mode 100644 (file)
index 0000000..e07c764
--- /dev/null
@@ -0,0 +1,48 @@
+#include "RtsTypeable.h"
+#include "Rts.h"
+\r
+static StgPtr typeableStore = 0;\r
+#ifdef THREADED_RTS\r
+Mutex typeableStoreLock;\r
+#endif\r
+\r
+\r
+void\r
+initTypeableStore()\r
+{\r
+    typeableStore=0;\r
+#ifdef THREADED_RTS\r
+    initMutex(&typeableStoreLock);\r
+#endif\r
+}\r
+\r
+void\r
+exitTypeableStore()\r
+{\r
+#ifdef THREADED_RTS\r
+    /* TODO: Free Mutex! */\r
+#endif\r
+    if(typeableStore!=0) {\r
+        freeStablePtr((StgStablePtr)typeableStore);\r
+        typeableStore=0;\r
+    }\r
+}\r
+\r
+StgPtr\r
+getOrSetTypeableStore(StgPtr ptr)\r
+{\r
+    StgPtr ret = typeableStore;\r
+    if(ret==0) {\r
+#ifdef THREADED_RTS\r
+        ACQUIRE_LOCK(&typeableStoreLock);\r
+        ret=typeableStore;\r
+        if(ret==0) {\r
+#endif\r
+            typeableStore = ret = ptr;\r
+#ifdef THREADED_RTS\r
+        }\r
+        RELEASE_LOCK(&typeableStoreLock);\r
+#endif\r
+    }\r
+    return ret;\r
+}\r