/* -----------------------------------------------------------------------------
- * $Id: Exception.hc,v 1.17 2000/11/14 12:53:29 simonmar Exp $
+ * $Id: Exception.hc,v 1.25 2002/04/23 06:34:26 sof Exp $
*
* (c) The GHC Team, 1998-2000
*
*
* ---------------------------------------------------------------------------*/
+#include "Stg.h"
#include "Rts.h"
#include "Exception.h"
#include "Schedule.h"
ASSERT(CurrentTSO->blocked_exceptions != NULL);
#if defined(GRAN)
awakenBlockedQueue(CurrentTSO->blocked_exceptions,
- CurrentTSO->block_info.closure);
+ (StgClosure*)NULL);
#elif defined(PAR)
- // is CurrentTSO->block_info.closure always set to the node
- // holding the blocking queue !? -- HWL
+ /* we don't need node info (2nd arg) in this case
+ (note that CurrentTSO->block_info.closure isn't always set) */
awakenBlockedQueue(CurrentTSO->blocked_exceptions,
- CurrentTSO->block_info.closure);
+ (StgClosure*)NULL);
#else
awakenBlockedQueue(CurrentTSO->blocked_exceptions);
#endif
*/
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);
barf("killThreadzh_fast");
}
} else {
- STGCALL2(raiseAsync, R1.t, R2.cl);
+ STGCALL2(raiseAsyncWithLock, R1.t, R2.cl);
}
JMP_(ENTRY_CODE(Sp[0]));
FE_
}
+
/* -----------------------------------------------------------------------------
Catch frames
-------------------------------------------------------------------------- */
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
#if defined(PROFILING)
-
/* Debugging tool: on raising an exception, show where we are. */
/* ToDo: currently this is a hack. Would be much better if
* the info was only displayed for an *uncaught* exception.
*/
if (RtsFlags.ProfFlags.showCCSOnException) {
- STGCALL2(print_ccs,stderr,CCCS);
+ STGCALL2(fprintCCS,stderr,CCCS);
}
-
#endif
p = Su;
* 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->header.info = &stg_raise_info;
+ */
+ 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;
while (1) {