--- /dev/null
+/****************************************************************
+* *
+* Spark Management Routines (Sparks.lc) *
+* *
+* Contains the spark-management routines used by GUM *
+* (c) The Parade/AQUA Projects, Glasgow University, 1995 *
+* Kevin Hammond, 27 February 1995 *
+* *
+*****************************************************************/
+
+
+\begin{code}
+#if defined(PAR) || defined(GRAN) /* whole file */
+
+#include "rtsdefs.h"
+\end{code}
+
+This uses GranSim-style sparkqs rather than old-style sparks as used
+in the threaded world. The problem with the latter is that they
+contain insufficient information (we also need to know whether a spark
+is local/global etc.). Problem: at the moment GUMM uses threaded-style
+sparks (presumably). ToDo: Fix this...
+
+\begin{code}
+P_
+FindLocalSpark(forexport)
+rtsBool forexport;
+{
+#ifdef PAR
+ P_ spark;
+
+ while (PendingSparksHd[REQUIRED_POOL] < PendingSparksTl[REQUIRED_POOL]) {
+ spark = *PendingSparksHd[REQUIRED_POOL]++;
+ if (SHOULD_SPARK(spark))
+ return spark;
+ }
+ while (PendingSparksHd[ADVISORY_POOL] < PendingSparksTl[ADVISORY_POOL]) {
+ spark = *PendingSparksHd[ADVISORY_POOL]++;
+ if (SHOULD_SPARK(spark))
+ return spark;
+ }
+ return NULL;
+
+#else
+
+ fprintf(stderr,"FindLocalSpark: under GRAN!\n");
+ abort();
+
+# if 0
+ sparkq spark, prev, next, thespark;
+
+ int pool, poolcount;
+
+ thespark = NULL;
+
+ for (poolcount = 0, pool = REQUIRED_POOL;
+ thespark == NULL && poolcount < 2;
+ ++poolcount, pool = ADVISORY_POOL) {
+ for (prev = NULL, spark = PendingSparksHd[pool];
+ spark != NULL && thespark == NULL; spark = next) {
+ next = SPARK_NEXT(spark);
+
+ if (SHOULD_SPARK(SPARK_NODE(spark))) {
+ /* Don't Steal local sparks */
+ if (forexport && !SPARK_GLOBAL(spark)) {
+ prev = spark;
+ continue;
+ }
+ SPARK_NEXT(spark) = NULL;
+ thespark = spark;
+ } else {
+ DisposeSpark(spark);
+ }
+
+ if (spark == PendingSparksHd[pool])
+ PendingSparksHd[pool] = next;
+
+ if (prev != NULL)
+ SPARK_NEXT(prev) = next;
+ }
+
+ if (PendingSparksHd[pool] == NULL)
+ PendingSparksTl[pool] = NULL;
+ }
+ return (thespark == NULL ? NULL : thespark);
+# endif /* 0 */
+
+#endif
+}
+
+#ifdef PAR
+void
+DisposeSpark(spark)
+P_ spark;
+{
+ /* Do nothing */
+}
+
+#else
+# ifndef GRAN
+void
+DisposeSpark(spark)
+sparkq spark;
+{
+ if(spark!=NULL)
+ free(spark);
+}
+# endif
+#endif
+
+rtsBool
+Spark(closure, required)
+P_ closure;
+rtsBool required;
+{
+#ifdef PAR
+ I_ pool = required ? REQUIRED_POOL : ADVISORY_POOL;
+
+ if (SHOULD_SPARK(closure) && PendingSparksTl[pool] < PendingSparksLim[pool]) {
+ *PendingSparksTl[pool]++ = closure;
+ }
+#endif
+ return rtsTrue;
+}
+
+#endif /* PAR or GRAN -- whole file */
+\end{code}