projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixes for building the libraries with cabal on Windows
[ghc-hetmet.git]
/
rts
/
Schedule.c
diff --git
a/rts/Schedule.c
b/rts/Schedule.c
index
f67fcd9
..
3d87003
100644
(file)
--- a/
rts/Schedule.c
+++ b/
rts/Schedule.c
@@
-588,6
+588,10
@@
run_thread:
prev_what_next = t->what_next;
errno = t->saved_errno;
prev_what_next = t->what_next;
errno = t->saved_errno;
+#if mingw32_HOST_OS
+ SetLastError(t->saved_winerror);
+#endif
+
cap->in_haskell = rtsTrue;
dirtyTSO(t);
cap->in_haskell = rtsTrue;
dirtyTSO(t);
@@
-637,6
+641,10
@@
run_thread:
// XXX: possibly bogus for SMP because this thread might already
// be running again, see code below.
t->saved_errno = errno;
// XXX: possibly bogus for SMP because this thread might already
// be running again, see code below.
t->saved_errno = errno;
+#if mingw32_HOST_OS
+ // Similarly for Windows error code
+ t->saved_winerror = GetLastError();
+#endif
#if defined(THREADED_RTS)
// If ret is ThreadBlocked, and this Task is bound to the TSO that
#if defined(THREADED_RTS)
// If ret is ThreadBlocked, and this Task is bound to the TSO that
@@
-854,7
+862,8
@@
schedulePushWork(Capability *cap USED_IF_THREADS,
static void
scheduleStartSignalHandlers(Capability *cap)
{
static void
scheduleStartSignalHandlers(Capability *cap)
{
- if (signals_pending()) { // safe outside the lock
+ if (RtsFlags.MiscFlags.install_signal_handlers && signals_pending()) {
+ // safe outside the lock
startSignalHandlers(cap);
}
}
startSignalHandlers(cap);
}
}
@@
-977,7
+986,7
@@
scheduleDetectDeadlock (Capability *cap, Task *task)
* for signals to arrive rather then bombing out with a
* deadlock.
*/
* for signals to arrive rather then bombing out with a
* deadlock.
*/
- if ( anyUserHandlers() ) {
+ if ( RtsFlags.MiscFlags.install_signal_handlers && anyUserHandlers() ) {
debugTrace(DEBUG_sched,
"still deadlocked, waiting for signals...");
debugTrace(DEBUG_sched,
"still deadlocked, waiting for signals...");
@@
-1810,7
+1819,7
@@
scheduleHandleThreadFinished (Capability *cap STG_UNUSED, Task *task, StgTSO *t)
(unsigned long)t->id, whatNext_strs[t->what_next]);
/* Inform the Hpc that a thread has finished */
(unsigned long)t->id, whatNext_strs[t->what_next]);
/* Inform the Hpc that a thread has finished */
- hs_hpc_event("Thread Finished",t);
+ hs_hpc_thread_finished_event(t);
#if defined(GRAN)
endThread(t, CurrentProc); // clean-up the thread
#if defined(GRAN)
endThread(t, CurrentProc); // clean-up the thread
@@
-2102,7
+2111,7
@@
scheduleDoGC (Capability *cap, Task *task USED_IF_THREADS, rtsBool force_major)
* Singleton fork(). Do not copy any running threads.
* ------------------------------------------------------------------------- */
* Singleton fork(). Do not copy any running threads.
* ------------------------------------------------------------------------- */
-StgInt
+pid_t
forkProcess(HsStablePtr *entry
#ifndef FORKPROCESS_PRIMOP_SUPPORTED
STG_UNUSED
forkProcess(HsStablePtr *entry
#ifndef FORKPROCESS_PRIMOP_SUPPORTED
STG_UNUSED
@@
-2187,6
+2196,10
@@
forkProcess(HsStablePtr *entry
cap->returning_tasks_tl = NULL;
#endif
cap->returning_tasks_tl = NULL;
#endif
+ // On Unix, all timers are reset in the child, so we need to start
+ // the timer again.
+ startTimer();
+
cap = rts_evalStableIO(cap, entry, NULL); // run the action
rts_checkSchedStatus("forkProcess",cap);
cap = rts_evalStableIO(cap, entry, NULL); // run the action
rts_checkSchedStatus("forkProcess",cap);
@@
-2283,9
+2296,17
@@
void *
suspendThread (StgRegTable *reg)
{
Capability *cap;
suspendThread (StgRegTable *reg)
{
Capability *cap;
- int saved_errno = errno;
+ int saved_errno;
StgTSO *tso;
Task *task;
StgTSO *tso;
Task *task;
+#if mingw32_HOST_OS
+ StgWord32 saved_winerror;
+#endif
+
+ saved_errno = errno;
+#if mingw32_HOST_OS
+ saved_winerror = GetLastError();
+#endif
/* assume that *reg is a pointer to the StgRegTable part of a Capability.
*/
/* assume that *reg is a pointer to the StgRegTable part of a Capability.
*/
@@
-2330,6
+2351,9
@@
suspendThread (StgRegTable *reg)
#endif
errno = saved_errno;
#endif
errno = saved_errno;
+#if mingw32_HOST_OS
+ SetLastError(saved_winerror);
+#endif
return task;
}
return task;
}
@@
-2338,8
+2362,16
@@
resumeThread (void *task_)
{
StgTSO *tso;
Capability *cap;
{
StgTSO *tso;
Capability *cap;
- int saved_errno = errno;
Task *task = task_;
Task *task = task_;
+ int saved_errno;
+#if mingw32_HOST_OS
+ StgWord32 saved_winerror;
+#endif
+
+ saved_errno = errno;
+#if mingw32_HOST_OS
+ saved_winerror = GetLastError();
+#endif
cap = task->cap;
// Wait for permission to re-enter the RTS with the result.
cap = task->cap;
// Wait for permission to re-enter the RTS with the result.
@@
-2367,6
+2399,9
@@
resumeThread (void *task_)
cap->r.rCurrentTSO = tso;
cap->in_haskell = rtsTrue;
errno = saved_errno;
cap->r.rCurrentTSO = tso;
cap->in_haskell = rtsTrue;
errno = saved_errno;
+#if mingw32_HOST_OS
+ SetLastError(saved_winerror);
+#endif
/* We might have GC'd, mark the TSO dirty again */
dirtyTSO(tso);
/* We might have GC'd, mark the TSO dirty again */
dirtyTSO(tso);
@@
-2674,7
+2709,9
@@
GetRoots( evac_fn evac )
#if defined(RTS_USER_SIGNALS)
// mark the signal handlers (signals should be already blocked)
#if defined(RTS_USER_SIGNALS)
// mark the signal handlers (signals should be already blocked)
- markSignalHandlers(evac);
+ if (RtsFlags.MiscFlags.install_signal_handlers) {
+ markSignalHandlers(evac);
+ }
#endif
}
#endif
}