#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);
} 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 *);
* 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
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
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];
#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)
#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 { \
#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
#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()