X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FException.hc;h=81c1c36c03bec5cf69b6e6c36667b182be9e4ec3;hb=97906cfcc30dd591e840921d336fdabeb1b8a315;hp=f7b58878cec1498728d815801c152664db56a361;hpb=25f7169979a66f0ea58aa01477e019988d895be9;p=ghc-hetmet.git diff --git a/ghc/rts/Exception.hc b/ghc/rts/Exception.hc index f7b5887..81c1c36 100644 --- a/ghc/rts/Exception.hc +++ b/ghc/rts/Exception.hc @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Exception.hc,v 1.21 2001/08/17 14:44:54 simonmar Exp $ + * $Id: Exception.hc,v 1.25 2002/04/23 06:34:26 sof Exp $ * * (c) The GHC Team, 1998-2000 * @@ -191,7 +191,7 @@ FN_(killThreadzh_fast) */ if (R1.t == CurrentTSO) { SaveThreadState(); /* inline! */ - STGCALL2(raiseAsync, R1.t, R2.cl); + STGCALL2(raiseAsyncWithLock, R1.t, R2.cl); if (CurrentTSO->what_next == ThreadKilled) { R1.w = ThreadFinished; JMP_(StgReturn); @@ -205,13 +205,14 @@ FN_(killThreadzh_fast) barf("killThreadzh_fast"); } } else { - STGCALL2(raiseAsync, R1.t, R2.cl); + STGCALL2(raiseAsyncWithLock, R1.t, R2.cl); } JMP_(ENTRY_CODE(Sp[0])); FE_ } + /* ----------------------------------------------------------------------------- Catch frames -------------------------------------------------------------------------- */ @@ -260,8 +261,8 @@ CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_5_entry,RET_VEC(Sp[SP_OFF],5)); CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_6_entry,RET_VEC(Sp[SP_OFF],6)); CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_7_entry,RET_VEC(Sp[SP_OFF],7)); -#ifdef PROFILING -#define CATCH_FRAME_BITMAP 7 +#if defined(PROFILING) +#define CATCH_FRAME_BITMAP 15 #else #define CATCH_FRAME_BITMAP 3 #endif @@ -355,7 +356,7 @@ FN_(raisezh_fast) * the info was only displayed for an *uncaught* exception. */ if (RtsFlags.ProfFlags.showCCSOnException) { - STGCALL2(print_ccs,stderr,CCCS); + STGCALL2(fprintCCS,stderr,CCCS); } #endif @@ -365,8 +366,18 @@ FN_(raisezh_fast) * is the exception raise. It is used to overwrite all the * thunks which are currently under evaluataion. */ + /* + // @LDV profiling + // stg_raise_info has THUNK as its closure type. Since a THUNK takes at least + // MIN_UPD_SIZE words in its payload, MIN_UPD_SIZE is more approprate than 1. + // It seems that 1 does not cause any problem unless profiling is performed. + // However, when LDV profiling goes on, we need to linearly scan small object pool, + // where raise_closure is stored, so we should use MIN_UPD_SIZE. raise_closure = (StgClosure *)RET_STGCALL1(P_,allocate, sizeofW(StgClosure)+1); + */ + raise_closure = (StgClosure *)RET_STGCALL1(P_,allocate, + sizeofW(StgClosure)+MIN_UPD_SIZE); SET_HDR(raise_closure, &stg_raise_info, CCCS); raise_closure->payload[0] = R1.cl;