projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
More rules for bootstrapping
[ghc-hetmet.git]
/
rts
/
Schedule.h
diff --git
a/rts/Schedule.h
b/rts/Schedule.h
index
89ac112
..
97ee78e
100644
(file)
--- a/
rts/Schedule.h
+++ b/
rts/Schedule.h
@@
-12,6
+12,7
@@
#include "OSThreads.h"
#include "Capability.h"
#include "OSThreads.h"
#include "Capability.h"
+#include "EventLog.h"
/* initScheduler(), exitScheduler()
* Called from STG : no
/* initScheduler(), exitScheduler()
* Called from STG : no
@@
-70,7
+71,9
@@
StgWord findRetryFrameHelper (StgTSO *tso);
* Called from STG : NO
* Locks assumed : none
*/
* Called from STG : NO
* Locks assumed : none
*/
-void workerStart(Task *task);
+#if defined(THREADED_RTS)
+void OSThreadProcAttr workerStart(Task *task);
+#endif
#if defined(GRAN)
void awaken_blocked_queue(StgBlockingQueueElement *q, StgClosure *node);
#if defined(GRAN)
void awaken_blocked_queue(StgBlockingQueueElement *q, StgClosure *node);
@@
-87,11
+90,6
@@
void awaken_blocked_queue(StgTSO *q);
void initThread(StgTSO *tso, nat stack_size);
#endif
void initThread(StgTSO *tso, nat stack_size);
#endif
-/* Context switch flag.
- * Locks required : none (conflicts are harmless)
- */
-extern int RTS_VAR(context_switch);
-
/* The state of the scheduler. This is used to control the sequence
* of events during shutdown, and when the runtime is interrupted
* using ^C.
/* The state of the scheduler. This is used to control the sequence
* of events during shutdown, and when the runtime is interrupted
* using ^C.
@@
-100,7
+98,7
@@
extern int RTS_VAR(context_switch);
#define SCHED_INTERRUPTING 1 /* ^C detected, before threads are deleted */
#define SCHED_SHUTTING_DOWN 2 /* final shutdown */
#define SCHED_INTERRUPTING 1 /* ^C detected, before threads are deleted */
#define SCHED_SHUTTING_DOWN 2 /* final shutdown */
-extern rtsBool RTS_VAR(sched_state);
+extern volatile StgWord RTS_VAR(sched_state);
/*
* flag that tracks whether we have done any execution in this time slice.
/*
* flag that tracks whether we have done any execution in this time slice.
@@
-116,7
+114,7
@@
extern rtsBool RTS_VAR(sched_state);
* INACTIVE to DONE_GC happens under sched_mutex. No lock required
* to set it to ACTIVITY_YES.
*/
* INACTIVE to DONE_GC happens under sched_mutex. No lock required
* to set it to ACTIVITY_YES.
*/
-extern nat recent_activity;
+extern volatile StgWord recent_activity;
/* Thread queues.
* Locks required : sched_mutex
/* Thread queues.
* Locks required : sched_mutex
@@
-142,6
+140,8
@@
extern StgTSO *RTS_VAR(sleeping_queue);
*/
extern rtsBool blackholes_need_checking;
*/
extern rtsBool blackholes_need_checking;
+extern rtsBool heap_overflow;
+
#if defined(THREADED_RTS)
extern Mutex RTS_VAR(sched_mutex);
#endif
#if defined(THREADED_RTS)
extern Mutex RTS_VAR(sched_mutex);
#endif
@@
-154,6
+154,7
@@
void interruptStgRts (void);
nat run_queue_len (void);
void resurrectThreads (StgTSO *);
nat run_queue_len (void);
void resurrectThreads (StgTSO *);
+void performPendingThrowTos (StgTSO *);
void printAllThreads(void);
void printAllThreads(void);
@@
-188,10
+189,10
@@
appendToRunQueue (Capability *cap, StgTSO *tso)
setTSOLink(cap, cap->run_queue_tl, tso);
}
cap->run_queue_tl = tso;
setTSOLink(cap, cap->run_queue_tl, tso);
}
cap->run_queue_tl = tso;
+ postEvent (cap, EVENT_THREAD_RUNNABLE, tso->id, 0);
}
}
-/* Push a thread on the beginning of the run queue. Used for
- * newly awakened threads, so they get run as soon as possible.
+/* Push a thread on the beginning of the run queue.
* ASSUMES: cap->running_task is the current task.
*/
INLINE_HEADER void
* ASSUMES: cap->running_task is the current task.
*/
INLINE_HEADER void
@@
-236,16
+237,21
@@
appendToBlockedQueue(StgTSO *tso)
#endif
#if defined(THREADED_RTS)
#endif
#if defined(THREADED_RTS)
+// Assumes: my_cap is owned by the current Task. We hold
+// other_cap->lock, but we do not necessarily own other_cap; another
+// Task may be running on it.
INLINE_HEADER void
INLINE_HEADER void
-appendToWakeupQueue (Capability *cap, StgTSO *tso)
+appendToWakeupQueue (Capability *my_cap, Capability *other_cap, StgTSO *tso)
{
ASSERT(tso->_link == END_TSO_QUEUE);
{
ASSERT(tso->_link == END_TSO_QUEUE);
- if (cap->wakeup_queue_hd == END_TSO_QUEUE) {
- cap->wakeup_queue_hd = tso;
+ if (other_cap->wakeup_queue_hd == END_TSO_QUEUE) {
+ other_cap->wakeup_queue_hd = tso;
} else {
} else {
- setTSOLink(cap, cap->wakeup_queue_tl, tso);
+ // my_cap is passed to setTSOLink() because it may need to
+ // write to the mutable list.
+ setTSOLink(my_cap, other_cap->wakeup_queue_tl, tso);
}
}
- cap->wakeup_queue_tl = tso;
+ other_cap->wakeup_queue_tl = tso;
}
#endif
}
#endif