1 /* -----------------------------------------------------------------------------
3 * (c) The GHC Team, 1995-2009
5 * The RTS stores some "global" values on behalf of libraries, so that
6 * some libraries can ensure that certain top-level things are shared
7 * even when multiple versions of the library are loaded. e.g. see
8 * Data.Typeable and GHC.Conc.
10 * How are multiple versions of a library loaded? Examples:
12 * base - a statically-linked ghci has its own copy, so might libraries it
15 * libHSghc - a statically-linked ghc has its own copy and so will Core
16 * plugins it dynamically loads.
18 * ---------------------------------------------------------------------------*/
20 #include "PosixSource.h"
24 #include "StablePtr.h"
27 GHCConcSignalSignalHandlerStore
,
28 GHCConcWindowsPendingDelaysStore
,
29 GHCConcWindowsIOManagerThreadStore
,
30 GHCConcWindowsProddingStore
,
31 SystemEventThreadEventManagerStore
,
32 SystemEventThreadIOManagerThreadStore
,
33 SystemTimerThreadEventManagerStore
,
34 SystemTimerThreadIOManagerThreadStore
,
35 LibHSghcFastStringTable
,
36 LibHSghcPersistentLinkerState
,
37 LibHSghcInitLinkerDone
,
38 LibHSghcGlobalDynFlags
,
39 LibHSghcStaticOptions
,
40 LibHSghcStaticOptionsReady
,
44 #if defined(THREADED_RTS)
45 Mutex globalStoreLock
;
48 static StgStablePtr store
[MaxStoreKey
];
54 for (i
=0; i
< MaxStoreKey
; i
++) {
57 #if defined(THREADED_RTS)
58 initMutex(&globalStoreLock
);
66 #if defined(THREADED_RTS)
67 closeMutex(&globalStoreLock
);
69 for (i
=0; i
< MaxStoreKey
; i
++) {
71 freeStablePtr(store
[i
]);
77 static StgStablePtr
getOrSetKey(StoreKey key
, StgStablePtr ptr
)
79 StgStablePtr ret
= store
[key
];
81 #if defined(THREADED_RTS)
82 ACQUIRE_LOCK(&globalStoreLock
);
86 store
[key
] = ret
= ptr
;
87 #if defined(THREADED_RTS)
89 RELEASE_LOCK(&globalStoreLock
);
95 #define mkStoreAccessor(name) \
97 getOrSet##name(StgStablePtr ptr) \
98 { return getOrSetKey(name, ptr); }
100 mkStoreAccessor(GHCConcSignalSignalHandlerStore
)
101 mkStoreAccessor(GHCConcWindowsPendingDelaysStore
)
102 mkStoreAccessor(GHCConcWindowsIOManagerThreadStore
)
103 mkStoreAccessor(GHCConcWindowsProddingStore
)
104 mkStoreAccessor(SystemEventThreadEventManagerStore
)
105 mkStoreAccessor(SystemEventThreadIOManagerThreadStore
)
106 mkStoreAccessor(SystemTimerThreadEventManagerStore
)
107 mkStoreAccessor(SystemTimerThreadIOManagerThreadStore
)
108 mkStoreAccessor(LibHSghcFastStringTable
)
109 mkStoreAccessor(LibHSghcPersistentLinkerState
)
110 mkStoreAccessor(LibHSghcInitLinkerDone
)
111 mkStoreAccessor(LibHSghcGlobalDynFlags
)
112 mkStoreAccessor(LibHSghcStaticOptions
)
113 mkStoreAccessor(LibHSghcStaticOptionsReady
)