X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FStgMiscClosures.cmm;h=8fd96c16fc568e21cf3b54b88d0402991e375d5b;hb=609e7ddfb10bc04762b820e70e0487ad6c514c2e;hp=270c600f7cdedaf4e119b3a4db722606843060b7;hpb=c245355e6f2c7b7c95e9af910c4d420e13af9413;p=ghc-hetmet.git diff --git a/rts/StgMiscClosures.cmm b/rts/StgMiscClosures.cmm index 270c600..8fd96c1 100644 --- a/rts/StgMiscClosures.cmm +++ b/rts/StgMiscClosures.cmm @@ -13,8 +13,8 @@ #include "Cmm.h" import pthread_mutex_lock; -import base_GHCziBase_Czh_static_info; -import base_GHCziBase_Izh_static_info; +import ghczmprim_GHCziTypes_Czh_static_info; +import ghczmprim_GHCziTypes_Izh_static_info; import EnterCriticalSection; import LeaveCriticalSection; @@ -289,11 +289,6 @@ INFO_TABLE(stg_IND_OLDGEN_PERM,1,0,IND_OLDGEN_PERM,"IND_OLDGEN_PERM","IND_OLDGEN */ INFO_TABLE(stg_BLACKHOLE,0,1,BLACKHOLE,"BLACKHOLE","BLACKHOLE") { -#if defined(GRAN) - /* Before overwriting TSO_LINK */ - STGCALL3(GranSimBlock,CurrentTSO,CurrentProc,(StgClosure *)R1 /*Node*/); -#endif - TICK_ENT_BH(); #ifdef THREADED_RTS @@ -309,7 +304,7 @@ INFO_TABLE(stg_BLACKHOLE,0,1,BLACKHOLE,"BLACKHOLE","BLACKHOLE") #endif /* Put ourselves on the blackhole queue */ - StgTSO_link(CurrentTSO) = W_[blackhole_queue]; + StgTSO__link(CurrentTSO) = W_[blackhole_queue]; W_[blackhole_queue] = CurrentTSO; /* jot down why and on what closure we are blocked */ @@ -319,48 +314,9 @@ INFO_TABLE(stg_BLACKHOLE,0,1,BLACKHOLE,"BLACKHOLE","BLACKHOLE") jump stg_block_blackhole; } -#if defined(PAR) || defined(GRAN) - -INFO_TABLE(stg_RBH,1,1,RBH,"RBH","RBH") -{ -# if defined(GRAN) - /* mainly statistics gathering for GranSim simulation */ - STGCALL3(GranSimBlock,CurrentTSO,CurrentProc,(StgClosure *)R1 /*Node*/); -# endif - - /* exactly the same as a BLACKHOLE_BQ_entry -- HWL */ - /* Put ourselves on the blocking queue for this black hole */ - TSO_link(CurrentTSO) = StgBlockingQueue_blocking_queue(R1); - StgBlockingQueue_blocking_queue(R1) = CurrentTSO; - /* jot down why and on what closure we are blocked */ - TSO_why_blocked(CurrentTSO) = BlockedOnBlackHole::I16; - TSO_block_info(CurrentTSO) = R1; - - /* PAR: dumping of event now done in blockThread -- HWL */ - - /* stg_gen_block is too heavyweight, use a specialised one */ - jump stg_block_1; -} - -INFO_TABLE(stg_RBH_Save_0,0,2,CONSTR,"RBH_Save_0","RBH_Save_0") -{ foreign "C" barf("RBH_Save_0 object entered!") never returns; } - -INFO_TABLE(stg_RBH_Save_1,1,1,CONSTR,"RBH_Save_1","RBH_Save_1"); -{ foreign "C" barf("RBH_Save_1 object entered!") never returns; } - -INFO_TABLE(stg_RBH_Save_2,2,0,CONSTR,"RBH_Save_2","RBH_Save_2"); -{ foreign "C" barf("RBH_Save_2 object entered!") never returns; } - -#endif /* defined(PAR) || defined(GRAN) */ - /* identical to BLACKHOLEs except for the infotag */ INFO_TABLE(stg_CAF_BLACKHOLE,0,1,CAF_BLACKHOLE,"CAF_BLACKHOLE","CAF_BLACKHOLE") { -#if defined(GRAN) - /* mainly statistics gathering for GranSim simulation */ - STGCALL3(GranSimBlock,CurrentTSO,CurrentProc,(StgClosure *)R1 /*Node*/); -#endif - TICK_ENT_BH(); LDV_ENTER(R1); @@ -374,7 +330,7 @@ INFO_TABLE(stg_CAF_BLACKHOLE,0,1,CAF_BLACKHOLE,"CAF_BLACKHOLE","CAF_BLACKHOLE") #endif /* Put ourselves on the blackhole queue */ - StgTSO_link(CurrentTSO) = W_[blackhole_queue]; + StgTSO__link(CurrentTSO) = W_[blackhole_queue]; W_[blackhole_queue] = CurrentTSO; /* jot down why and on what closure we are blocked */ @@ -384,22 +340,38 @@ INFO_TABLE(stg_CAF_BLACKHOLE,0,1,CAF_BLACKHOLE,"CAF_BLACKHOLE","CAF_BLACKHOLE") jump stg_block_blackhole; } -#ifdef EAGER_BLACKHOLING -INFO_TABLE(stg_SE_BLACKHOLE,0,1,SE_BLACKHOLE,"SE_BLACKHOLE","SE_BLACKHOLE") -{ foreign "C" barf("SE_BLACKHOLE object entered!") never returns; } +INFO_TABLE(__stg_EAGER_BLACKHOLE,0,1,BLACKHOLE,"EAGER_BLACKHOLE","EAGER_BLACKHOLE") +{ + TICK_ENT_BH(); + +#ifdef THREADED_RTS + // foreign "C" debugBelch("BLACKHOLE entry\n"); +#endif + + /* Actually this is not necessary because R1 is about to be destroyed. */ + LDV_ENTER(R1); -INFO_TABLE(stg_SE_CAF_BLACKHOLE,0,1,SE_CAF_BLACKHOLE,"SE_CAF_BLACKHOLE","SE_CAF_BLACKHOLE") -{ foreign "C" barf("SE_CAF_BLACKHOLE object entered!") never returns; } +#if defined(THREADED_RTS) + ACQUIRE_LOCK(sched_mutex "ptr"); + // released in stg_block_blackhole_finally #endif + /* Put ourselves on the blackhole queue */ + StgTSO__link(CurrentTSO) = W_[blackhole_queue]; + W_[blackhole_queue] = CurrentTSO; + + /* jot down why and on what closure we are blocked */ + StgTSO_why_blocked(CurrentTSO) = BlockedOnBlackHole::I16; + StgTSO_block_info(CurrentTSO) = R1; + + jump stg_block_blackhole; +} + /* ---------------------------------------------------------------------------- Whiteholes are used for the "locked" state of a closure (see lockClosure()) - - The closure type is BLAKCHOLE, just because we need a valid closure type - for sanity checking. ------------------------------------------------------------------------- */ -INFO_TABLE(stg_WHITEHOLE, 0,0, BLACKHOLE, "WHITEHOLE", "WHITEHOLE") +INFO_TABLE(stg_WHITEHOLE, 0,0, WHITEHOLE, "WHITEHOLE", "WHITEHOLE") { foreign "C" barf("WHITEHOLE object entered!") never returns; } /* ---------------------------------------------------------------------------- @@ -412,14 +384,6 @@ INFO_TABLE(stg_TSO, 0,0,TSO, "TSO", "TSO") { foreign "C" barf("TSO object entered!") never returns; } /* ---------------------------------------------------------------------------- - Evacuees are left behind by the garbage collector. Any attempt to enter - one is a real bug. - ------------------------------------------------------------------------- */ - -INFO_TABLE(stg_EVACUATED,1,0,EVACUATED,"EVACUATED","EVACUATED") -{ foreign "C" barf("EVACUATED object entered!") never returns; } - -/* ---------------------------------------------------------------------------- Weak pointers Live weak pointers have a special closure type. Dead ones are just @@ -427,16 +391,16 @@ INFO_TABLE(stg_EVACUATED,1,0,EVACUATED,"EVACUATED","EVACUATED") live weak pointers with dead ones). ------------------------------------------------------------------------- */ -INFO_TABLE(stg_WEAK,0,4,WEAK,"WEAK","WEAK") +INFO_TABLE(stg_WEAK,1,4,WEAK,"WEAK","WEAK") { foreign "C" barf("WEAK object entered!") never returns; } /* * It's important when turning an existing WEAK into a DEAD_WEAK * (which is what finalizeWeak# does) that we don't lose the link * field and break the linked list of weak pointers. Hence, we give - * DEAD_WEAK 4 non-pointer fields, the same as WEAK. + * DEAD_WEAK 5 non-pointer fields. */ -INFO_TABLE_CONSTR(stg_DEAD_WEAK,0,4,0,CONSTR,"DEAD_WEAK","DEAD_WEAK") +INFO_TABLE_CONSTR(stg_DEAD_WEAK,0,5,0,CONSTR,"DEAD_WEAK","DEAD_WEAK") { foreign "C" barf("DEAD_WEAK object entered!") never returns; } /* ---------------------------------------------------------------------------- @@ -600,17 +564,19 @@ CLOSURE(stg_dummy_ret_closure,stg_dummy_ret); #if defined(__PIC__) && defined(mingw32_TARGET_OS) /* - * When sticking the RTS in a DLL, we delay populating the + * When sticking the RTS in a Windows DLL, we delay populating the * Charlike and Intlike tables until load-time, which is only * when we've got the real addresses to the C# and I# closures. - * + * + * -- this is currently broken BL 2009/11/14. + * we don't rewrite to static closures at all with Windows DLLs. */ -#warning Is this correct? _imp is a pointer! -#define Char_hash_static_info _imp__base_GHCziBase_Czh_static_info -#define Int_hash_static_info _imp__base_GHCziBase_Izh_static_info +// #warning Is this correct? _imp is a pointer! +#define Char_hash_static_info _imp__ghczmprim_GHCziTypes_Czh_static_info +#define Int_hash_static_info _imp__ghczmprim_GHCziTypes_Izh_static_info #else -#define Char_hash_static_info base_GHCziBase_Czh_static_info -#define Int_hash_static_info base_GHCziBase_Izh_static_info +#define Char_hash_static_info ghczmprim_GHCziTypes_Czh_static_info +#define Int_hash_static_info ghczmprim_GHCziTypes_Izh_static_info #endif @@ -623,6 +589,7 @@ CLOSURE(stg_dummy_ret_closure,stg_dummy_ret); /* end the name with _closure, to convince the mangler this is a closure */ +#if !(defined(__PIC__) && defined(mingw32_HOST_OS)) section "data" { stg_CHARLIKE_closure: CHARLIKE_HDR(0) @@ -919,3 +886,5 @@ section "data" { INTLIKE_HDR(15) INTLIKE_HDR(16) /* MAX_INTLIKE == 16 */ } + +#endif // !(defined(__PIC__) && defined(mingw32_HOST_OS))