3 #include "TopHandler.h"
5 #if defined(THREADED_RTS)
6 static Mutex m
; // Protects the operations on topHandlerPtr,
9 static StgStablePtr topHandlerPtr
;
11 void rts_setMainThread(StgWeak
*weak
) {
13 if (topHandlerPtr
!= NULL
) {
14 freeStablePtr(topHandlerPtr
); // OK to do under the lock
16 topHandlerPtr
= getStablePtr((StgPtr
)weak
);
17 // referent is a Weak#
18 ASSERT(weak
->header
.info
== &stg_WEAK_info
);
20 // See Note [rts_setMainThread has an unsound type] in
21 // libraries/base/GHC/TopHandler.hs.
22 ASSERT(weak
->key
->header
.info
== &stg_TSO_info
);
27 StgTSO
*getTopHandlerThread(void) {
29 StgWeak
*weak
= (StgWeak
*)deRefStablePtr(topHandlerPtr
);
32 // topHandlerPtr was never initialised
35 const StgInfoTable
*info
= ACQUIRE_LOAD(&weak
->header
.info
);
36 if (info
== &stg_WEAK_info
) {
37 StgClosure
*key
= ((StgWeak
*)weak
)->key
;
39 // See Note [rts_setMainThread has an unsound type] in
40 // libraries/base/GHC/TopHandler.hs.
41 ASSERT(key
->header
.info
== &stg_TSO_info
);
44 } else if (info
== &stg_DEAD_WEAK_info
) {
47 barf("getTopHandlerThread: neither a WEAK nor a DEAD_WEAK: %p %p %d",
48 weak
, info
, info
->type
);
53 void initTopHandler(void) {
54 #if defined(THREADED_RTS)
60 void exitTopHandler(void) {
61 freeStablePtr(topHandlerPtr
);
63 #if defined(THREADED_RTS)