X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FStgMiscClosures.cmm;h=7f7cf78f7b95cfbe350fc112323a4749b5d7a004;hb=5892af0e08fdb890b5a0b9a64346d9f7773a6ed8;hp=afd302aeffdce5864ae032a20e6eadd19a4214ab;hpb=0981e24e9980b8b26e6f20fc56bebc1c7416cc4f;p=ghc-hetmet.git diff --git a/rts/StgMiscClosures.cmm b/rts/StgMiscClosures.cmm index afd302a..7f7cf78 100644 --- a/rts/StgMiscClosures.cmm +++ b/rts/StgMiscClosures.cmm @@ -12,13 +12,11 @@ #include "Cmm.h" -#ifdef __PIC__ import pthread_mutex_lock; -import EnterCriticalSection -import LeaveCriticalSection -import base_GHCziBase_Czh_static_info; -import base_GHCziBase_Izh_static_info; -#endif +import ghczmprim_GHCziTypes_Czh_static_info; +import ghczmprim_GHCziTypes_Izh_static_info; +import EnterCriticalSection; +import LeaveCriticalSection; /* ---------------------------------------------------------------------------- Support for the bytecode interpreter. @@ -311,7 +309,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 */ @@ -376,7 +374,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 */ @@ -386,22 +384,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; } /* ---------------------------------------------------------------------------- @@ -414,14 +428,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 @@ -467,11 +473,11 @@ INFO_TABLE(stg_STABLE_NAME,0,1,STABLE_NAME,"STABLE_NAME","STABLE_NAME") and entry code for each type. ------------------------------------------------------------------------- */ -INFO_TABLE(stg_FULL_MVAR,3,0,MVAR,"MVAR","MVAR") -{ foreign "C" barf("FULL_MVAR object entered!") never returns; } +INFO_TABLE(stg_MVAR_CLEAN,3,0,MVAR_CLEAN,"MVAR","MVAR") +{ foreign "C" barf("MVAR object entered!") never returns; } -INFO_TABLE(stg_EMPTY_MVAR,3,0,MVAR,"MVAR","MVAR") -{ foreign "C" barf("EMPTY_MVAR object entered!") never returns; } +INFO_TABLE(stg_MVAR_DIRTY,3,0,MVAR_DIRTY,"MVAR","MVAR") +{ foreign "C" barf("MVAR object entered!") never returns; } /* ----------------------------------------------------------------------------- STM @@ -608,11 +614,11 @@ CLOSURE(stg_dummy_ret_closure,stg_dummy_ret); * */ #warning Is this correct? _imp is a pointer! -#define Char_hash_static_info _imp__base_GHCziBase_Czh_static -#define Int_hash_static_info _imp__base_GHCziBase_Izh_static +#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 -#define Int_hash_static_info base_GHCziBase_Izh_static +#define Char_hash_static_info ghczmprim_GHCziTypes_Czh_static_info +#define Int_hash_static_info ghczmprim_GHCziTypes_Izh_static_info #endif