]> granicus.if.org Git - php/commitdiff
improve the current sigio handling on win32
authorAnatol Belski <ab@php.net>
Mon, 27 Oct 2014 09:08:58 +0000 (10:08 +0100)
committerAnatol Belski <ab@php.net>
Mon, 27 Oct 2014 09:08:58 +0000 (10:08 +0100)
phpdbg_prompt.c
phpdbg_sigio_win32.c
phpdbg_sigio_win32.h

index 82444fbf1d39731fcaf3cd778b88b96474c2ccba..72063c194af778799d565a69e0130aa1bc091797 100644 (file)
@@ -1211,7 +1211,8 @@ int phpdbg_interactive(zend_bool allow_async_unsafe TSRMLS_DC) /* {{{ */
 
 #ifdef PHP_WIN32
 #define PARA ((phpdbg_param_t *)stack.next)->type
-                               if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE && (RUN_PARAM == PARA || EVAL_PARAM == PARA)) {
+#define HANDLE_SIGIO (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) && PARA != EMPTY_PARAM
+                               if (HANDLE_SIGIO) {
                                        sigio_watcher_start();
                                }
 #endif
@@ -1228,6 +1229,12 @@ int phpdbg_interactive(zend_bool allow_async_unsafe TSRMLS_DC) /* {{{ */
                                        case PHPDBG_FINISH:
                                        case PHPDBG_UNTIL:
                                        case PHPDBG_NEXT: {
+#ifdef PHP_WIN32
+                                               if (HANDLE_SIGIO) {
+                                                       sigio_watcher_stop();
+                                                       sigio_watcher_start();
+                                               }
+#endif
                                                phpdbg_activate_err_buf(0 TSRMLS_CC);
                                                phpdbg_free_err_buf(TSRMLS_C);
                                                if (!EG(in_execution) && !(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
@@ -1240,10 +1247,11 @@ int phpdbg_interactive(zend_bool allow_async_unsafe TSRMLS_DC) /* {{{ */
                                phpdbg_activate_err_buf(0 TSRMLS_CC);
                                phpdbg_free_err_buf(TSRMLS_C);
 #ifdef PHP_WIN32
-                               if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE && (RUN_PARAM == PARA || EVAL_PARAM == PARA)) {
+                               if (HANDLE_SIGIO) {
                                        sigio_watcher_stop();
                                }
 #undef PARA
+#undef HANDLE_SIGIO
 #endif
                        }
 
index 24e9ac0e0aacdceacd0b9577ca1e99c2f59dc880..158e034872be353325e250d6454cadd53a48c5f8 100644 (file)
@@ -33,30 +33,31 @@ SigIoWatcherThread(VOID *p)
        struct win32_sigio_watcher_data *swd = (struct win32_sigio_watcher_data *)p;
 #ifdef ZTS
        void ***tsrm_ls = swd->tsrm_ls;
-top:
-       (void)phpdbg_consume_bytes(swd->fd, &sig, 1, -1, tsrm_ls);
-#else
-top:
-       (void)phpdbg_consume_bytes(swd->fd, &sig, 1, -1);
 #endif
 
+top:
+       (void)phpdbg_consume_bytes(swd->fd, &sig, 1, -1 TSRMLS_CC);
+
 
        if (3 == sig) {
-               printf("signaled, got %d", sig);
                /* XXX completely not sure it is done right here */
-               if (swd->flags & PHPDBG_IS_INTERACTIVE) {
+               if (PHPDBG_G(flags) & PHPDBG_IS_INTERACTIVE) {
                        if (raise(sig)) {
-                               /* just out*/
-                               exit(0);
+                               goto top;
                        }
                }
-               if (swd->flags & PHPDBG_IS_SIGNALED) {
+               if (PHPDBG_G(flags) & PHPDBG_IS_SIGNALED) {
                        phpdbg_set_sigsafe_mem(&sig TSRMLS_CC);
                        zend_try {
                                phpdbg_force_interruption(TSRMLS_C);
                        } zend_end_try();
                        phpdbg_clear_sigsafe_mem(TSRMLS_C);
+                       goto end;
+               }
+               if (!(PHPDBG_G(flags) & PHPDBG_IS_INTERACTIVE)) {
+                       PHPDBG_G(flags) |= PHPDBG_IS_SIGNALED;
                }
+end:
                /* XXX set signaled flag to the caller thread, question is - whether it's needed */
                ExitThread(sig);
        } else {
@@ -74,8 +75,6 @@ sigio_watcher_start(void)
        TSRMLS_FETCH();
 
        PHPDBG_G(swd).fd = PHPDBG_G(io)[PHPDBG_STDIN].fd;
-       PHPDBG_G(swd).running = 1;
-       PHPDBG_G(swd).flags = PHPDBG_G(flags);
 #ifdef ZTS
        PHPDBG_G(swd).tsrm_ls = tsrm_ls;
 #endif
@@ -113,8 +112,6 @@ sigio_watcher_stop(void)
        }
 
        PHPDBG_G(swd).fd = -1;
-       PHPDBG_G(swd).running = 0;
-       PHPDBG_G(swd).flags = 0;
        PHPDBG_G(sigio_watcher_thread) = INVALID_HANDLE_VALUE;
 }
 
index 796b477f936a9e4a959fa042626dfafe0366601a..8c8a381d64bd773cbe6261065e99fb80c2651b0a 100644 (file)
 #include "phpdbg_io.h"
 
 struct win32_sigio_watcher_data {
-       zend_ulong flags;
 #ifdef ZTS
        void ***tsrm_ls;
 #endif
        int fd;
-       zend_uchar running;
 };
 
 void