Add SMP-WAKE primitive.
authorMatt Birkholz <puck@birchwood-abbey.net>
Tue, 21 Jul 2015 20:13:06 +0000 (13:13 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Thu, 26 Nov 2015 08:09:45 +0000 (01:09 -0700)
src/microcode/ossmp.h
src/microcode/prossmp.c
src/microcode/uxsig.c

index d5fc39bfb0677d492ace020d5c1bc0ca91020884..61570364cf433e874d9a9bb180dcddeeb25d43b0 100644 (file)
@@ -65,6 +65,7 @@ extern void smp_gc_start (void);
 extern void smp_gc_finish (void);
 
 extern void smp_kill_gc (processor_t *);
+extern void smp_kill_timer (processor_t *);
 
 #ifdef ENABLE_DEBUGGING_TOOLS
 
index fabbaa4cd137c4484980877a74e629ddbcd617aa..8d02e58b468ba308d417646e1e806292410760c0 100644 (file)
@@ -359,6 +359,29 @@ access to the thread system.")
 #endif
 }
 
+DEFINE_PRIMITIVE ("SMP-WAKE", Prim_smp_wake, 1, 1, "(SMP-WAKE id)\n\
+Send a timer interrupt to processor ID.")
+{
+  PRIMITIVE_HEADER (0);
+
+#ifdef ENABLE_SMP
+  {
+    int id = arg_integer (1);
+    trace (";%d SMP-Wake %d.", self->id, id);
+    for (processor_t *p = processors; p != NULL; p = p->next)
+      if (p->id == id)
+       {
+         smp_kill_timer (p);
+         PRIMITIVE_RETURN (UNSPECIFIC);
+       }
+    outf_error_line (";%d smp-wake: bogus processor id %d", self->id, id);
+  }
+#else
+  signal_error_from_primitive (ERR_UNIMPLEMENTED_PRIMITIVE);
+#endif
+  PRIMITIVE_RETURN (UNSPECIFIC);
+}
+
 DEFINE_PRIMITIVE ("SMP-GC-WAIT", Prim_smp_gc_wait, 0, 0, "(SMP-GC-WAIT)\n\
 Put the current processor in the GC-WAIT state.\n\
 Called by the global-gc interrupt handler.")
index 2f675f4c5617dd51ea9bd7235a9677bd4922594c..e00712e9bd8822352f3b5f99c755104f0921d680 100644 (file)
@@ -519,6 +519,12 @@ smp_kill_gc (processor_t *p)
   pthread_kill (p->pthread, SIGUSR2);
 }
 
+void
+smp_kill_timer (processor_t *p)
+{
+  pthread_kill (p->pthread, SIGALRM);
+}
+
 #endif /* ENABLE_SMP */
 
 /* The following conditionalization would more naturally be expressed