Index: /trunk/source/lisp-kernel/imports.s
===================================================================
--- /trunk/source/lisp-kernel/imports.s	(revision 13969)
+++ /trunk/source/lisp-kernel/imports.s	(revision 13970)
@@ -49,5 +49,5 @@
 	defimport(allocate)
 	defimport(deallocate)
-	defimport(jvm_init)
+	defimport(wait_for_signal)
 	defimport(tcr_frame_ptr)
 	defimport(register_xmacptr_dispose_function)
Index: /trunk/source/lisp-kernel/lisp.h
===================================================================
--- /trunk/source/lisp-kernel/lisp.h	(revision 13969)
+++ /trunk/source/lisp-kernel/lisp.h	(revision 13970)
@@ -95,3 +95,6 @@
 extern FILE *dbgout;
 
+void
+install_signal_handler(int, void*, Boolean);
+
 #endif /* __lisp__ */
Index: /trunk/source/lisp-kernel/pmcl-kernel.c
===================================================================
--- /trunk/source/lisp-kernel/pmcl-kernel.c	(revision 13969)
+++ /trunk/source/lisp-kernel/pmcl-kernel.c	(revision 13970)
@@ -757,11 +757,21 @@
 }
 
-
-
 #ifndef WINDOWS
+natural user_signal_semaphores[NSIG];
+sigset_t user_signals_reserved;
+#endif
+
+
+
+#ifndef WINDOWS
 void
 user_signal_handler (int signum, siginfo_t *info, ExceptionInformation *context)
 {
-  if (signum == SIGINT) {
+  SEMAPHORE s = (SEMAPHORE)user_signal_semaphores[signum];
+
+  if (s != 0) {
+    signal_semaphore(s);
+  }
+  else if (signum == SIGINT) {
     lisp_global(INTFLAG) = (((signum<<8) + 1) << fixnumshift);
   }
@@ -779,4 +789,5 @@
 #endif
 
+
 void
 register_user_signal_handler()
@@ -789,10 +800,29 @@
   SetConsoleCtrlHandler(ControlEventHandler,TRUE);
 #else
-  install_signal_handler(SIGINT, (void *)user_signal_handler);
-  install_signal_handler(SIGTERM, (void *)user_signal_handler);
-#endif
-}
-
-
+  install_signal_handler(SIGINT, (void *)user_signal_handler, false);
+  install_signal_handler(SIGTERM, (void *)user_signal_handler, false);
+  install_signal_handler(SIGQUIT, (void *)user_signal_handler, false);
+#endif
+}
+
+int
+wait_for_signal(int signo, int seconds, int milliseconds)
+{
+#ifdef WINDOWS
+  return EINVAL;
+#else
+  if ((signo <= 0) || (signo >= NSIG)) {
+    return EINVAL;
+  }
+  if (sigismember(&user_signals_reserved,signo)) {
+    return EINVAL;
+  }
+  if (user_signal_semaphores[signo] == 0) {
+    user_signal_semaphores[signo] = (natural)new_semaphore(0);
+    install_signal_handler(signo,(void *)user_signal_handler, false);
+  }
+  return wait_on_semaphore((void *)user_signal_semaphores[signo],seconds,milliseconds);
+#endif
+}
 
 BytePtr
@@ -2122,27 +2152,4 @@
 }
 
-/* A horrible hack to allow us to initialize a JVM instance from lisp.
-   On Darwin, creating a JVM instance clobbers the thread's existing
-   Mach exception infrastructure, so we save and restore it here.
-*/
-
-typedef int (*jvm_initfunc)(void*,void*,void*);
-
-int
-jvm_init(jvm_initfunc f,void*arg0,void*arg1,void*arg2)
-{
-  int result = -1;
-  TCR *tcr = get_tcr(1);
-#ifdef DARWIN
-  extern kern_return_t tcr_establish_lisp_exception_port(TCR *);
-#endif
-  
-  result = f(arg0,arg1,arg2);
-#ifdef DARWIN
-  tcr_establish_lisp_exception_port(tcr);
-#endif
-  return result;
-}
-  
 
 
Index: /trunk/source/lisp-kernel/ppc-exceptions.c
===================================================================
--- /trunk/source/lisp-kernel/ppc-exceptions.c	(revision 13969)
+++ /trunk/source/lisp-kernel/ppc-exceptions.c	(revision 13970)
@@ -2209,5 +2209,5 @@
 
 void
-install_signal_handler(int signo, void *handler)
+install_signal_handler(int signo, void *handler, Boolean system)
 {
   struct sigaction sa;
@@ -2226,4 +2226,9 @@
 
   sigaction(signo, &sa, NULL);
+  if (system) {
+    extern sigset_t user_signals_reserved;
+    sigaddset(&user_signals_reserved, signo);
+  }
+
 }
 
@@ -2244,15 +2249,15 @@
   if (install_signal_handlers_for_exceptions) {
     extern int no_sigtrap;
-    install_signal_handler(SIGILL, (void *)signal_handler);
+    install_signal_handler(SIGILL, (void *)signal_handler, true);
     if (no_sigtrap != 1) {
-      install_signal_handler(SIGTRAP, (void *)signal_handler);
-    }
-    install_signal_handler(SIGBUS,  (void *)signal_handler);
-    install_signal_handler(SIGSEGV, (void *)signal_handler);
-    install_signal_handler(SIGFPE, (void *)signal_handler);
+      install_signal_handler(SIGTRAP, (void *)signal_handler, true);
+    }
+    install_signal_handler(SIGBUS,  (void *)signal_handler, true);
+    install_signal_handler(SIGSEGV, (void *)signal_handler, true);
+    install_signal_handler(SIGFPE, (void *)signal_handler, true);
   }
   
   install_signal_handler(SIGNAL_FOR_PROCESS_INTERRUPT,
-			 (void *)interrupt_handler);
+			 (void *)interrupt_handler, true);
   signal(SIGPIPE, SIG_IGN);
 }
@@ -2293,6 +2298,6 @@
   thread_kill_signal = SIG_KILL_THREAD;
 
-  install_signal_handler(thread_suspend_signal, (void *) suspend_resume_handler);
-  install_signal_handler(thread_kill_signal, (void *)thread_kill_handler);
+  install_signal_handler(thread_suspend_signal, (void *) suspend_resume_handler, true);
+  install_signal_handler(thread_kill_signal, (void *)thread_kill_handler, tru);
 }
 
Index: /trunk/source/lisp-kernel/x86-exceptions.c
===================================================================
--- /trunk/source/lisp-kernel/x86-exceptions.c	(revision 13969)
+++ /trunk/source/lisp-kernel/x86-exceptions.c	(revision 13970)
@@ -1860,5 +1860,5 @@
 #ifndef WINDOWS
 void
-install_signal_handler(int signo, void * handler)
+install_signal_handler(int signo, void * handler, Boolean system)
 {
   struct sigaction sa;
@@ -1878,4 +1878,8 @@
 
   sigaction(signo, &sa, NULL);
+  if (system) {
+    extern sigset_t user_signals_reserved;
+    sigaddset(&user_signals_reserved, signo);
+  }
 }
 #endif
@@ -2093,9 +2097,9 @@
 #endif
   ;
-  install_signal_handler(SIGILL, handler);
+  install_signal_handler(SIGILL, handler, true);
   
-  install_signal_handler(SIGBUS, handler);
-  install_signal_handler(SIGSEGV,handler);
-  install_signal_handler(SIGFPE, handler);
+  install_signal_handler(SIGBUS, handler, true);
+  install_signal_handler(SIGSEGV,handler, true);
+  install_signal_handler(SIGFPE, handler, true);
 #endif
   
@@ -2106,5 +2110,5 @@
                          arbstack_interrupt_handler
 #endif
-);
+                         ,true);
   signal(SIGPIPE, SIG_IGN);
 }
@@ -2300,6 +2304,6 @@
   thread_kill_signal = SIG_KILL_THREAD;
 
-  install_signal_handler(thread_suspend_signal, (void *)SUSPEND_RESUME_HANDLER);
-  install_signal_handler(thread_kill_signal, (void *)THREAD_KILL_HANDLER);
+  install_signal_handler(thread_suspend_signal, (void *)SUSPEND_RESUME_HANDLER, true);
+  install_signal_handler(thread_kill_signal, (void *)THREAD_KILL_HANDLER, true);
 }
 #endif
