Alternative Time::Local algorithm that uses matemathical formula
[p5sagit/p5-mst-13.2.git] / win32 / win32.c
index 9dd9bea..40b7511 100644 (file)
@@ -1722,7 +1722,7 @@ win32_async_check(pTHX)
     /* Passing PeekMessage -1 as HWND (2nd arg) only get PostThreadMessage() messages
      * and ignores window messages - should co-exist better with windows apps e.g. Tk
      */ 
-    while (PeekMessage(&msg, (HWND)-1, 0, 0, PM_REMOVE)) {
+    while (PeekMessage(&msg, (HWND)-1, 0, 0, PM_REMOVE|PM_NOYIELD)) {
        switch(msg.message) {
 
 #if 0
@@ -1742,8 +1742,10 @@ win32_async_check(pTHX)
        
        case WM_TIMER: {
            /* alarm() is a one-shot but SetTimer() repeats so kill it */
-           KillTimer(NULL,w32_timerid);
-           w32_timerid=0;  
+           if (w32_timerid) {
+               KillTimer(NULL,w32_timerid);
+               w32_timerid=0;  
+            }
            /* Now fake a call to signal handler */
            CALL_FPTR(PL_sighandlerp)(14);
            break;
@@ -1757,6 +1759,7 @@ win32_async_check(pTHX)
            break;
        }
     }
+    w32_poll_count = 0;
 
     /* Above or other stuff may have set a signal flag */
     if (PL_sig_pending) {
@@ -4447,19 +4450,24 @@ Perl_init_os_extras(void)
      */
 }
 
-static PerlInterpreter* win32_process_perl = NULL;
-
-BOOL WINAPI 
-win32_ctrlhandler(DWORD dwCtrlType)
+PerlInterpreter *
+win32_signal_context(void)
 {
     dTHX;
     if (!my_perl) {
-       my_perl = win32_process_perl;
-       if (!my_perl) {
-           return FALSE;
-       }
+       my_perl = PL_curinterp;
        PERL_SET_THX(my_perl);
-    }
+    } 
+    return my_perl;
+}
+
+BOOL WINAPI 
+win32_ctrlhandler(DWORD dwCtrlType)
+{
+    dTHXa(PERL_GET_SIG_CONTEXT);
+
+    if (!my_perl)
+       return FALSE;
 
     switch(dwCtrlType) {
     case CTRL_CLOSE_EVENT:
@@ -4473,12 +4481,12 @@ win32_ctrlhandler(DWORD dwCtrlType)
 
     case CTRL_C_EVENT:
        /*  A CTRL+c signal was received */
-       CALL_FPTR(PL_sighandlerp)(2); /* SIGINT */
+       CALL_FPTR(PL_sighandlerp)(SIGINT); /* SIGINT */
        return TRUE;    
 
     case CTRL_BREAK_EVENT:
        /*  A CTRL+BREAK signal was received */
-       CALL_FPTR(PL_sighandlerp)(3); /* SIGQUIT */
+       CALL_FPTR(PL_sighandlerp)(SIGBREAK); /* unix calls it SIGQUIT */
        return TRUE;    
 
     case CTRL_LOGOFF_EVENT:
@@ -4491,6 +4499,8 @@ win32_ctrlhandler(DWORD dwCtrlType)
       /*  A signal that the system sends to all console processes when the system is 
           shutting down. 
        */
+       CALL_FPTR(PL_sighandlerp)(SIGTERM); 
+       return TRUE;    
        break;  
     default:
        break;  
@@ -4526,6 +4536,15 @@ win32_get_child_IO(child_IO_table* ptbl)
 #ifdef HAVE_INTERP_INTERN
 
 
+static void
+win32_csighandler(int sig)
+{
+#if 0
+    dTHXa(PERL_GET_SIG_CONTEXT);
+    Perl_warn(aTHX_ "Got signal %d",sig);
+#endif
+    /* Does nothing */
+}
 
 void
 Perl_sys_intern_init(pTHX)
@@ -4542,10 +4561,12 @@ Perl_sys_intern_init(pTHX)
     w32_num_pseudo_children    = 0;
 #  endif
     w32_init_socktype          = 0;
-    if (!win32_process_perl) {
-       win32_process_perl = my_perl;
+    w32_timerid                 = 0;
+    w32_poll_count              = 0;
+    if (my_perl == PL_curinterp) {
         /* Force C runtime signal stuff to set its console handler */
-       signal(SIGINT,SIG_DFL);
+       signal(SIGINT,&win32_csighandler);
+       signal(SIGBREAK,&win32_csighandler);
         /* Push our handler on top */
        SetConsoleCtrlHandler(win32_ctrlhandler,TRUE);
     }
@@ -4558,9 +4579,12 @@ Perl_sys_intern_clear(pTHX)
     Safefree(w32_perlshell_vec);
     /* NOTE: w32_fdpid is freed by sv_clean_all() */
     Safefree(w32_children);
-    if (my_perl == win32_process_perl) {
+    if (w32_timerid) {
+       KillTimer(NULL,w32_timerid);
+       w32_timerid=0;  
+    }
+    if (my_perl == PL_curinterp) {
        SetConsoleCtrlHandler(win32_ctrlhandler,FALSE);
-       win32_process_perl = NULL;
     }
 #  ifdef USE_ITHREADS
     Safefree(w32_pseudo_children);
@@ -4580,6 +4604,8 @@ Perl_sys_intern_dup(pTHX_ struct interp_intern *src, struct interp_intern *dst)
     dst->pseudo_id             = 0;
     Newz(1313, dst->pseudo_children, 1, child_tab);
     dst->thr_intern.Winit_socktype = 0;
+    dst->timerid                 = 0;
+    dst->poll_count              = 0;
 }
 #  endif /* USE_ITHREADS */
 #endif /* HAVE_INTERP_INTERN */