summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e30a37b)
scheduleHandleStackOverflow: fix bug in non-threaded RTS - if
(task->tso != NULL), then (task->tso) is not necessarily the TSO we
are running (in the threaded RTS it is).
Also fix a few non-threaded warnings while I'm here.
// scheduler clearer.
//
static void schedulePreLoop (void);
// scheduler clearer.
//
static void schedulePreLoop (void);
static void schedulePushWork(Capability *cap, Task *task);
static void schedulePushWork(Capability *cap, Task *task);
static void scheduleStartSignalHandlers (void);
static void scheduleCheckBlockedThreads (Capability *cap);
static void scheduleCheckBlackHoles (Capability *cap);
static void scheduleStartSignalHandlers (void);
static void scheduleCheckBlockedThreads (Capability *cap);
static void scheduleCheckBlackHoles (Capability *cap);
#endif
nat prev_what_next;
rtsBool ready_to_gc;
#endif
nat prev_what_next;
rtsBool ready_to_gc;
+#if defined(THREADED_RTS)
* Push work to other Capabilities if we have some.
* -------------------------------------------------------------------------- */
* Push work to other Capabilities if we have some.
* -------------------------------------------------------------------------- */
-schedulePushWork(Capability *cap, Task *task)
+schedulePushWork(Capability *cap USED_WHEN_SMP,
+ Task *task USED_WHEN_SMP)
Capability *free_caps[n_capabilities], *cap0;
nat i, n_free_caps;
Capability *free_caps[n_capabilities], *cap0;
nat i, n_free_caps;
}
}
task->cap = cap; // reset to point to our Capability.
}
}
task->cap = cap; // reset to point to our Capability.
/* ----------------------------------------------------------------------------
* Start any pending signal handlers
/* ----------------------------------------------------------------------------
* Start any pending signal handlers
/* enlarge the stack */
StgTSO *new_t = threadStackOverflow(cap, t);
/* enlarge the stack */
StgTSO *new_t = threadStackOverflow(cap, t);
- /* This TSO has moved, so update any pointers to it from the
- * main thread stack. It better not be on any other queues...
- * (it shouldn't be).
+ /* The TSO attached to this Task may have moved, so update the
+ * pointer to it.
- if (task->tso != NULL) {
task->tso = new_t;
}
pushOnRunQueue(cap,new_t);
task->tso = new_t;
}
pushOnRunQueue(cap,new_t);
new_tso_size = round_to_mblocks(new_tso_size); /* Be MBLOCK-friendly */
new_stack_size = new_tso_size - TSO_STRUCT_SIZEW;
new_tso_size = round_to_mblocks(new_tso_size); /* Be MBLOCK-friendly */
new_stack_size = new_tso_size - TSO_STRUCT_SIZEW;
- IF_DEBUG(scheduler, sched_belch("increasing stack size from %ld words to %d.\n", tso->stack_size, new_stack_size));
+ IF_DEBUG(scheduler, sched_belch("increasing stack size from %ld words to %d.\n", (long)tso->stack_size, new_stack_size));
dest = (StgTSO *)allocate(new_tso_size);
TICK_ALLOC_TSO(new_stack_size,0);
dest = (StgTSO *)allocate(new_tso_size);
TICK_ALLOC_TSO(new_stack_size,0);