From: Roy T. Fielding Date: Thu, 26 Aug 1999 17:58:01 +0000 (+0000) Subject: OS/2 EMX library's select() isn't thread safe so bypass it and go direct to X-Git-Tag: PRE_APR_CHANGES~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5030a21695ccbbe139cff19a2e3b6b92829811b7;p=apache OS/2 EMX library's select() isn't thread safe so bypass it and go direct to the OS/2 API call. Unfortunately this only works on socket handles which will break probe_writable_fds() so I'll have to find a way to fix that too. Submitted by: Brian Havard git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@83796 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/os/os2/util_os2.c b/os/os2/util_os2.c index 820ea61800..86128412cf 100644 --- a/os/os2/util_os2.c +++ b/os/os2/util_os2.c @@ -68,7 +68,7 @@ int ap_os_kill(pid_t pid, int sig) char *ap_os_error_message(int err) { static char result[200]; - char message[HUGE_STRING_LEN]; + unsigned char message[HUGE_STRING_LEN]; ULONG len; char *pos; int c; @@ -94,3 +94,94 @@ char *ap_os_error_message(int err) return result; } + + + + +int (*os2_select)( int *, int, int, int, long ) = NULL; +static HMODULE hSO32DLL; + +int ap_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) +{ + int *fds, s, fd_count=0, rc; + int num_read, num_write, num_except; + long ms_timeout = -1; + + if (os2_select == NULL) { + DosEnterCritSec(); /* Stop two threads doing this at the same time */ + + if (os2_select == NULL) { + hSO32DLL = ap_os_dso_load("SO32DLL"); + + if (hSO32DLL) { + os2_select = ap_os_dso_sym(hSO32DLL, "SELECT"); + } + } + DosExitCritSec(); + } + + ap_assert(os2_select != NULL); + fds = alloca(sizeof(int) * nfds); + + if (readfds) { + for (s=0; stv_usec / 1000 + timeout->tv_sec * 1000; + + rc = os2_select(fds, num_read, num_write, num_except, ms_timeout); + + if (rc > 0) { + fd_count = 0; + + if (readfds) { + for (s=0; s