summaryrefslogtreecommitdiff
path: root/rts/Threads.h
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2006-06-16 10:33:42 +0000
committerSimon Marlow <simonmar@microsoft.com>2006-06-16 10:33:42 +0000
commitb1953bbb1ed3cb16497e5447db7487f0c2d9e41a (patch)
treedf9e129c57b586a952634dc080939b621ae64cf8 /rts/Threads.h
parent1e3d53b4707a6c9c7c99cdaa54e3646b840f5cc9 (diff)
downloadhaskell-b1953bbb1ed3cb16497e5447db7487f0c2d9e41a.tar.gz
Asynchronous exception support for SMP
This patch makes throwTo work with -threaded, and also refactors large parts of the concurrency support in the RTS to clean things up. We have some new files: RaiseAsync.{c,h} asynchronous exception support Threads.{c,h} general threading-related utils Some of the contents of these new files used to be in Schedule.c, which is smaller and cleaner as a result of the split. Asynchronous exception support in the presence of multiple running Haskell threads is rather tricky. In fact, to my annoyance there are still one or two bugs to track down, but the majority of the tests run now.
Diffstat (limited to 'rts/Threads.h')
-rw-r--r--rts/Threads.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/rts/Threads.h b/rts/Threads.h
new file mode 100644
index 0000000000..e331c50dae
--- /dev/null
+++ b/rts/Threads.h
@@ -0,0 +1,46 @@
+/* ---------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 2006
+ *
+ * Thread-related functionality
+ *
+ * --------------------------------------------------------------------------*/
+
+#ifndef THREADS_H
+#define THREADS_H
+
+#if defined(GRAN) || defined(PARALLEL_HASKELL)
+StgBlockingQueueElement * unblockOne (StgBlockingQueueElement *bqe,
+ StgClosure *node);
+#else
+StgTSO * unblockOne (Capability *cap, StgTSO *tso);
+StgTSO * unblockOne_ (Capability *cap, StgTSO *tso, rtsBool allow_migrate);
+#endif
+
+#if defined(GRAN) || defined(PARALLEL_HASKELL)
+void awakenBlockedQueue(StgBlockingQueueElement *q, StgClosure *node);
+#else
+void awakenBlockedQueue (Capability *cap, StgTSO *tso);
+#endif
+
+void removeThreadFromMVarQueue (StgMVar *mvar, StgTSO *tso);
+void removeThreadFromQueue (StgTSO **queue, StgTSO *tso);
+void removeThreadFromDeQueue (StgTSO **head, StgTSO **tail, StgTSO *tso);
+
+StgBool isThreadBound (StgTSO* tso);
+
+#ifdef DEBUG
+void printThreadBlockage (StgTSO *tso);
+void printThreadStatus (StgTSO *t);
+void printAllThreads (void);
+void printThreadQueue (StgTSO *t);
+# if defined(PARALLEL_HASKELL)
+void print_bq (StgClosure *node);
+void print_bqe (StgBlockingQueueElement *bqe);
+nat run_queue_len (void);
+# elif defined(GRAN)
+void print_bq (StgClosure *node);
+# endif
+#endif
+
+#endif /* THREADS_H */