/* 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
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;
break;
}
}
+ w32_poll_count = 0;
/* Above or other stuff may have set a signal flag */
if (PL_sig_pending) {
*/
}
-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:
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:
/* 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;
#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)
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);
}
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);
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 */