Change installman to instantiate a new Pod::Man instance for each
[p5sagit/p5-mst-13.2.git] / win32 / win32.h
index e06049b..f318890 100644 (file)
@@ -275,6 +275,7 @@ extern  int mkstemp(const char *path);
 #define  init_os_extras Perl_init_os_extras
 
 DllExport void         Perl_win32_init(int *argcp, char ***argvp);
+DllExport void         Perl_win32_term(void);
 DllExport void         Perl_init_os_extras(void);
 DllExport void         win32_str_os_error(void *sv, DWORD err);
 DllExport int          RunPerl(int argc, char **argv, char **env);
@@ -303,6 +304,7 @@ typedef struct {
 } child_IO_table;
 
 DllExport void         win32_get_child_IO(child_IO_table* ptr);
+DllExport HWND         win32_create_message_window();
 
 #ifndef USE_SOCKETS_AS_HANDLES
 extern FILE *          my_fdopen(int, char *);
@@ -352,14 +354,21 @@ typedef  char *           caddr_t;        /* In malloc.c (core address). */
  * Now Win32 specific per-thread data stuff
  */
 
+/* Leave the first couple ids after WM_USER unused because they
+ * might be used by an embedding application, and on Windows
+ * version before 2000 we might end up eating those messages
+ * if they were not meant for us.
+ */
+#define WM_USER_MIN     (WM_USER+30)
+#define WM_USER_MESSAGE (WM_USER_MIN)
+#define WM_USER_KILL    (WM_USER_MIN+1)
+#define WM_USER_MAX     (WM_USER_MIN+1)
+
 struct thread_intern {
     /* XXX can probably use one buffer instead of several */
     char               Wstrerror_buffer[512];
     struct servent     Wservent;
     char               Wgetlogin_buffer[128];
-#    ifdef USE_SOCKETS_AS_HANDLES
-    int                        Winit_socktype;
-#    endif
 #    ifdef HAVE_DES_FCRYPT
     char               Wcrypt_buffer[30];
 #    endif
@@ -377,6 +386,15 @@ typedef struct {
     HANDLE     handles[MAXIMUM_WAIT_OBJECTS];
 } child_tab;
 
+#ifdef USE_ITHREADS
+typedef struct {
+    long       num;
+    DWORD      pids[MAXIMUM_WAIT_OBJECTS];
+    HANDLE     handles[MAXIMUM_WAIT_OBJECTS];
+    HWND       message_hwnds[MAXIMUM_WAIT_OBJECTS];
+} pseudo_child_tab;
+#endif
+
 #ifndef Sighandler_t
 typedef Signal_t (*Sighandler_t) (int);
 #define Sighandler_t   Sighandler_t
@@ -390,10 +408,11 @@ struct interp_intern {
     child_tab *        children;
 #ifdef USE_ITHREADS
     DWORD      pseudo_id;
-    child_tab *        pseudo_children;
+    pseudo_child_tab * pseudo_children;
 #endif
     void *     internal_host;
     struct thread_intern       thr_intern;
+    HWND        message_hwnd;
     UINT       timerid;
     unsigned   poll_count;
     Sighandler_t sigtable[SIG_SIZE];
@@ -417,8 +436,10 @@ DllExport int win32_async_check(pTHX);
 #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_pseudo_child_message_hwnds (w32_pseudo_children->message_hwnds)
 #define w32_internal_host              (PL_sys_intern.internal_host)
 #define w32_timerid                    (PL_sys_intern.timerid)
+#define w32_message_hwnd               (PL_sys_intern.message_hwnd)
 #define w32_sighandler                 (PL_sys_intern.sigtable)
 #define w32_poll_count                 (PL_sys_intern.poll_count)
 #define w32_do_async                   (w32_poll_count++ > WIN32_POLL_INTERVAL)
@@ -426,26 +447,9 @@ DllExport int win32_async_check(pTHX);
 #define w32_getlogin_buffer    (PL_sys_intern.thr_intern.Wgetlogin_buffer)
 #define w32_crypt_buffer       (PL_sys_intern.thr_intern.Wcrypt_buffer)
 #define w32_servent            (PL_sys_intern.thr_intern.Wservent)
-#define w32_init_socktype      (PL_sys_intern.thr_intern.Winit_socktype)
 #define w32_use_showwindow     (PL_sys_intern.thr_intern.Wuse_showwindow)
 #define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow)
 
-/* UNICODE<>ANSI translation helpers */
-/* Use CP_ACP when mode is ANSI */
-/* Use CP_UTF8 when mode is UTF8 */
-
-#define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\
-    (lpw[0] = 0, MultiByteToWideChar((IN_BYTES) ? CP_ACP : CP_UTF8, 0, \
-                                   lpa, alen, lpw, (nBytes/sizeof(WCHAR))))
-#define A2WHELPER(lpa, lpw, nBytes)    A2WHELPER_LEN(lpa, -1, lpw, nBytes)
-
-#define W2AHELPER_LEN(lpw, wlen, lpa, nChars)\
-    (lpa[0] = '\0', WideCharToMultiByte((IN_BYTES) ? CP_ACP : CP_UTF8, 0, \
-                                      lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL))
-#define W2AHELPER(lpw, lpa, nChars)    W2AHELPER_LEN(lpw, -1, lpa, nChars)
-
-#define USING_WIDE() (0)
-
 #ifdef USE_ITHREADS
 #  define PERL_WAIT_FOR_CHILDREN \
     STMT_START {                                                       \
@@ -464,6 +468,9 @@ DllExport int win32_async_check(pTHX);
 #ifdef PERL_CORE
 
 /* C doesn't like repeat struct definitions */
+#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
+#undef _CRTIMP
+#endif
 #ifndef _CRTIMP
 #define _CRTIMP __declspec(dllimport)
 #endif
@@ -529,9 +536,13 @@ EXTERN_C _CRTIMP ioinfo* __pioinfo[];
 #if !defined(ECONNABORTED) && defined(WSAECONNABORTED)
 #define ECONNABORTED WSAECONNABORTED
 #endif
+#if !defined(ECONNRESET) && defined(WSAECONNRESET)
+#define ECONNRESET WSAECONNRESET
+#endif
 #if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT)
 #define EAFNOSUPPORT WSAEAFNOSUPPORT
 #endif
+/* Why not needed for ECONNREFUSED? --abe */
 
 DllExport void *win32_signal_context(void);
 #define PERL_GET_SIG_CONTEXT win32_signal_context()