StgTSO *target, // the TSO receiving the exception
StgClosure *exception, // the exception closure
/*[out]*/ void **out USED_IF_THREADS)
{
StgWord status;
StgTSO *target, // the TSO receiving the exception
StgClosure *exception, // the exception closure
/*[out]*/ void **out USED_IF_THREADS)
{
StgWord status;
- debugTrace(DEBUG_sched, "throwTo: from thread %lu to thread %lu",
- (unsigned long)source->id, (unsigned long)target->id);
+ if (source != NULL) {
+ debugTrace(DEBUG_sched, "throwTo: from thread %lu to thread %lu",
+ (unsigned long)source->id, (unsigned long)target->id);
+ } else {
+ debugTrace(DEBUG_sched, "throwTo: from RTS to thread %lu",
+ (unsigned long)target->id);
+ }
- debugTrace(DEBUG_sched, "throwTo: blocking on thread %lu", (unsigned long)target->id);
- setTSOLink(cap, source, target->blocked_exceptions);
- target->blocked_exceptions = source;
- dirty_TSO(cap,target); // we modified the blocked_exceptions queue
-
- source->block_info.tso = target;
- write_barrier(); // throwTo_exception *must* be visible if BlockedOnException is.
- source->why_blocked = BlockedOnException;
+ if (source != NULL) {
+ debugTrace(DEBUG_sched, "throwTo: blocking on thread %lu", (unsigned long)target->id);
+ setTSOLink(cap, source, target->blocked_exceptions);
+ target->blocked_exceptions = source;
+ dirty_TSO(cap,target); // we modified the blocked_exceptions queue
+
+ source->block_info.tso = target;
+ write_barrier(); // throwTo_exception *must* be visible if BlockedOnException is.
+ source->why_blocked = BlockedOnException;
+ }
// Perform the update
// TODO: this may waste some work, if the thunk has
// already been updated by another thread.
// Perform the update
// TODO: this may waste some work, if the thunk has
// already been updated by another thread.
// we've got an exception to raise, so let's pass it to the
// handler in this frame.
//
// we've got an exception to raise, so let's pass it to the
// handler in this frame.
//
TICK_ALLOC_SE_THK(1,0);
SET_HDR(raise,&stg_raise_info,cf->header.prof.ccs);
raise->payload[0] = exception;
TICK_ALLOC_SE_THK(1,0);
SET_HDR(raise,&stg_raise_info,cf->header.prof.ccs);
raise->payload[0] = exception;