]> granicus.if.org Git - apache/commitdiff
OS/2 EMX library's select() isn't thread safe so bypass it and go direct to
authorRoy T. Fielding <fielding@apache.org>
Thu, 26 Aug 1999 17:58:01 +0000 (17:58 +0000)
committerRoy T. Fielding <fielding@apache.org>
Thu, 26 Aug 1999 17:58:01 +0000 (17:58 +0000)
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

os/os2/util_os2.c

index 820ea618008010b6b9c99874d0ab414579754291..86128412cf89ac831b2c93388b49624ff6214a20 100644 (file)
@@ -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; s<nfds; s++)
+            if (FD_ISSET(s, readfds))
+                fds[fd_count++] = _getsockhandle(s);
+    }
+
+    num_read = fd_count;
+
+    if (writefds) {
+        for (s=0; s<nfds; s++)
+            if (FD_ISSET(s, writefds))
+                fds[fd_count++] = _getsockhandle(s);
+    }
+
+    num_write = fd_count - num_read;
+
+    if (exceptfds) {
+        for (s=0; s<nfds; s++)
+            if (FD_ISSET(s, exceptfds))
+                fds[fd_count++] = _getsockhandle(s);
+    }
+
+    num_except = fd_count - num_read - num_write;
+
+    if (timeout)
+        ms_timeout = timeout->tv_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<nfds; s++) {
+                if (FD_ISSET(s, readfds)) {
+                    if (fds[fd_count++] < 0)
+                        FD_CLR(s, readfds);
+                }
+            }
+        }
+
+        if (writefds) {
+            for (s=0; s<nfds; s++) {
+                if (FD_ISSET(s, writefds)) {
+                    if (fds[fd_count++] < 0)
+                        FD_CLR(s, writefds);
+                }
+            }
+        }
+
+        if (exceptfds) {
+            for (s=0; s<nfds; s++) {
+                if (FD_ISSET(s, exceptfds)) {
+                    if (fds[fd_count++] < 0)
+                        FD_CLR(s, exceptfds);
+                }
+            }
+        }
+    }
+
+    return rc;
+}