--- /dev/null
+/* -----------------------------------------------------------------------------
+ *
+ * (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
#include "Schedule.h"
#include "Storage.h"
#include "Sparks.h"
+#include "RtsTypeable.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
SymX(forkOS_createThread) \
SymX(freeHaskellFunctionPtr) \
SymX(freeStablePtr) \
+ SymX(getOrSetTypeableStore) \
SymX(gcdIntegerzh_fast) \
SymX(gcdIntegerIntzh_fast) \
SymX(gcdIntzh_fast) \
#include "ThreadLabels.h"
#include "BlockAlloc.h"
#include "Trace.h"
+#include "RtsTypeable.h"
#if defined(RTS_GTK_FRONTPANEL)
#include "FrontPanel.h"
/* initialise the stable pointer table */
initStablePtrTable();
+ /* initialise the shared Typeable store */
+ initTypeableStore();
+
#if defined(DEBUG)
/* initialise thread label table (tso->char*) */
initThreadLabelTable();
// also outputs the stats (+RTS -s) info.
exitStorage();
+ /* free shared Typeable store */
+ exitTypeableStore();
+
/* initialise the stable pointer table */
exitStablePtrTable();
--- /dev/null
+#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