applied somewhat modified version of suggested patch
[p5sagit/p5-mst-13.2.git] / win32 / win32.h
index 9eaf76a..d3224f1 100644 (file)
@@ -9,6 +9,8 @@
 #ifndef  _INC_WIN32_PERL5
 #define  _INC_WIN32_PERL5
 
+#define _WIN32_WINNT 0x0400    /* needed for TryEnterCriticalSection() etc. */
+
 #if defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI)
 #  define DYNAMIC_ENV_FETCH
 #  define ENV_HV_NAME "___ENV_HV_NAME___"
@@ -266,13 +268,6 @@ typedef long               gid_t;
 #  endif
 #endif
 
-#ifndef _O_NOINHERIT
-#  define _O_NOINHERIT 0x0080
-#  ifndef _NO_OLDNAMES
-#    define O_NOINHERIT        _O_NOINHERIT
-#  endif
-#endif
-
 #endif /* __MINGW32__ */
 
 /* compatibility stuff for other compilers goes here */
@@ -378,22 +373,20 @@ struct thread_intern {
 typedef struct {
     long       num;
     DWORD      pids[MAXIMUM_WAIT_OBJECTS];
+    HANDLE     handles[MAXIMUM_WAIT_OBJECTS];
 } child_tab;
 
-struct host_link {
-    char *     nameId;
-    void *     host_data;
-    struct host_link * next;
-};
-
 struct interp_intern {
     char *     perlshell_tokens;
     char **    perlshell_vec;
     long       perlshell_items;
     struct av *        fdpid;
     child_tab *        children;
-    HANDLE     child_handles[MAXIMUM_WAIT_OBJECTS];
-    struct host_link * hostlist;
+#ifdef USE_ITHREADS
+    DWORD      pseudo_id;
+    child_tab *        pseudo_children;
+#endif
+    void *     internal_host;
 #ifndef USE_THREADS
     struct thread_intern       thr_intern;
 #endif
@@ -407,8 +400,13 @@ struct interp_intern {
 #define w32_children           (PL_sys_intern.children)
 #define w32_num_children       (w32_children->num)
 #define w32_child_pids         (w32_children->pids)
-#define w32_child_handles      (PL_sys_intern.child_handles)
-#define w32_host_link          (PL_sys_intern.hostlist)
+#define w32_child_handles      (w32_children->handles)
+#define w32_pseudo_id          (PL_sys_intern.pseudo_id)
+#define w32_pseudo_children    (PL_sys_intern.pseudo_children)
+#define w32_num_pseudo_children                (w32_pseudo_children->num)
+#define w32_pseudo_child_pids          (w32_pseudo_children->pids)
+#define w32_pseudo_child_handles       (w32_pseudo_children->handles)
+#define w32_internal_host              (PL_sys_intern.internal_host)
 #ifdef USE_THREADS
 #  define w32_strerror_buffer  (thr->i.Wstrerror_buffer)
 #  define w32_getlogin_buffer  (thr->i.Wgetlogin_buffer)
@@ -435,6 +433,20 @@ struct interp_intern {
 
 #define USING_WIDE()   (PerlEnv_os_id() == VER_PLATFORM_WIN32_NT)
 
+#ifdef USE_ITHREADS
+#  define PERL_WAIT_FOR_CHILDREN \
+    STMT_START {                                                       \
+       if (w32_pseudo_children && w32_num_pseudo_children) {           \
+           long children = w32_num_pseudo_children;                    \
+           WaitForMultipleObjects(children,                            \
+                                  w32_pseudo_child_handles,            \
+                                  TRUE, INFINITE);                     \
+           while (children)                                            \
+               CloseHandle(w32_pseudo_child_handles[--children]);      \
+       }                                                               \
+    } STMT_END
+#endif
+
 /*
  * This provides a layer of functions and macros to ensure extensions will
  * get to use the same RTL functions as the core.