X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FTypeable.c;fp=rts%2FTypeable.c;h=e07c764c55362bc6a27215d58f8dbe72c84ff23b;hp=0000000000000000000000000000000000000000;hb=52589e05f86d593bc3e6ea3f1a0b8f6ceae94fe6;hpb=22afade657206fa4ac86ebb6ecc8f2352cca3c4f diff --git a/rts/Typeable.c b/rts/Typeable.c new file mode 100644 index 0000000..e07c764 --- /dev/null +++ b/rts/Typeable.c @@ -0,0 +1,48 @@ +#include "RtsTypeable.h" +#include "Rts.h" + +static StgPtr typeableStore = 0; +#ifdef THREADED_RTS +Mutex typeableStoreLock; +#endif + + +void +initTypeableStore() +{ + typeableStore=0; +#ifdef THREADED_RTS + initMutex(&typeableStoreLock); +#endif +} + +void +exitTypeableStore() +{ +#ifdef THREADED_RTS + /* TODO: Free Mutex! */ +#endif + if(typeableStore!=0) { + freeStablePtr((StgStablePtr)typeableStore); + typeableStore=0; + } +} + +StgPtr +getOrSetTypeableStore(StgPtr ptr) +{ + StgPtr ret = typeableStore; + if(ret==0) { +#ifdef THREADED_RTS + ACQUIRE_LOCK(&typeableStoreLock); + ret=typeableStore; + if(ret==0) { +#endif + typeableStore = ret = ptr; +#ifdef THREADED_RTS + } + RELEASE_LOCK(&typeableStoreLock); +#endif + } + return ret; +}