smp: Add smp-wake primitive.
authorMatt Birkholz <puck@birchwood-abbey.net>
Sat, 20 Dec 2014 16:05:57 +0000 (09:05 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Sun, 21 Dec 2014 19:19:09 +0000 (12:19 -0700)
src/microcode/ossmp.h
src/microcode/prossmp.c
src/microcode/uxsig.c

index 46a9c1be55d7e5345f60bce6c80dbe89dfdd2793..a51d0004dc2b28411364d98867f8619277c1f74e 100644 (file)
@@ -71,6 +71,7 @@ extern bool smp_gc_started (void);
 extern void smp_gc_finished (void);
 
 extern void smp_kill_gc (pthread_t);
+extern void smp_kill_timer (pthread_t);
 
 #endif
 
index fe5ee1ee0c62da1485a933a811b95789bc0c96a6..eab9c4797550abc1154198b76cfc62e36750d7a1 100644 (file)
@@ -529,6 +529,30 @@ Wait for interrupts.")
 #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);
+    processor_t *p;
+    for (p = processors; p != NULL; p = p->next)
+      if (p->id == id)
+       {
+         smp_kill_timer (p->pthread);
+         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);
+}
+
 #ifdef ENABLE_SMP
 static SCHEME_OBJECT smp_idle_prim = SHARP_F;
 
index 5b6347c9d3898011a72737715cbb209a69dfa7da..0d839f953a7efd2d1038b8ef970c3a7c7cde4df1 100644 (file)
@@ -520,6 +520,12 @@ smp_kill_gc (pthread_t thread)
   pthread_kill (thread, SIGUSR2);
 }
 
+void
+smp_kill_timer (pthread_t thread)
+{
+  pthread_kill (thread, SIGALRM);
+}
+
 #endif /* ENABLE_SMP */
 
 /* The following conditionalization would more naturally be expressed