apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mt...@apache.org
Subject svn commit: r743730 - in /apr/apr/branches/1.4.x: CHANGES file_io/win32/pipe.c poll/unix/select.c
Date Thu, 12 Feb 2009 13:26:12 GMT
Author: mturk
Date: Thu Feb 12 13:26:11 2009
New Revision: 743730

URL: http://svn.apache.org/viewvc?rev=743730&view=rev
Log:
Fix core on win32 when using wakeable pollset

Modified:
    apr/apr/branches/1.4.x/CHANGES
    apr/apr/branches/1.4.x/file_io/win32/pipe.c
    apr/apr/branches/1.4.x/poll/unix/select.c

Modified: apr/apr/branches/1.4.x/CHANGES
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/CHANGES?rev=743730&r1=743729&r2=743730&view=diff
==============================================================================
--- apr/apr/branches/1.4.x/CHANGES [utf-8] (original)
+++ apr/apr/branches/1.4.x/CHANGES [utf-8] Thu Feb 12 13:26:11 2009
@@ -1,6 +1,10 @@
                                                      -*- coding: utf-8 -*-
 Changes for APR 1.4.0
 
+  *) apr_pollset_wakeup() on Windows: Fix core caused by closing the
+     file_socket_pipe with standard file_close. 
+     [Arsen Chaloyan, Mladen Turk]
+
   *) apr_socket_sendfile() on Solaris: Fix handling of files truncated
      after the sender determines the length.  (This fixes a busy loop in 
      httpd when a file being served is truncated.)  [Jeff Trawick]

Modified: apr/apr/branches/1.4.x/file_io/win32/pipe.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/file_io/win32/pipe.c?rev=743730&r1=743729&r2=743730&view=diff
==============================================================================
--- apr/apr/branches/1.4.x/file_io/win32/pipe.c (original)
+++ apr/apr/branches/1.4.x/file_io/win32/pipe.c Thu Feb 12 13:26:11 2009
@@ -349,22 +349,9 @@
     return APR_SUCCESS;
 }
 
-#if 0
-/* XXX Do we need this as public API or APR private ?
- * It's main usage is for interrupting pollset because
- * of !APR_FILES_AS_SOCKETS.
- * Duplicating sockets in child requires WSADuplicateSocket
- * and passing WSAPROTOCOL_INFO data to the child, so we
- * would need some sort of IPC instead DuplicateHandle used
- * for files and pipes.
- */
-APR_DECLARE(apr_status_t)
-#else
-apr_status_t
-#endif
-apr_file_socket_pipe_create(apr_file_t **in,
-                            apr_file_t **out,
-                            apr_pool_t *p)
+apr_status_t apr_file_socket_pipe_create(apr_file_t **in,
+                                         apr_file_t **out,
+                                         apr_pool_t *p)
 {
     apr_status_t rv;
     SOCKET rd;
@@ -408,3 +395,20 @@
 
     return rv;
 }
+
+apr_status_t apr_file_socket_pipe_close(apr_file_t *file)
+{
+    apr_status_t stat;
+    if (!file->pipe)
+        return apr_file_close(file);
+    if ((stat = socket_pipe_cleanup(file)) == APR_SUCCESS) {
+        apr_pool_cleanup_kill(file->pool, file, socket_pipe_cleanup);
+
+        if (file->mutex) {
+            apr_thread_mutex_destroy(file->mutex);
+        }
+
+        return APR_SUCCESS;
+    }
+    return stat;
+}

Modified: apr/apr/branches/1.4.x/poll/unix/select.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/poll/unix/select.c?rev=743730&r1=743729&r2=743730&view=diff
==============================================================================
--- apr/apr/branches/1.4.x/poll/unix/select.c (original)
+++ apr/apr/branches/1.4.x/poll/unix/select.c Thu Feb 12 13:26:11 2009
@@ -195,6 +195,9 @@
                             apr_file_t **out,
                             apr_pool_t *p);
 
+extern apr_status_t
+apr_file_socket_pipe_close(apr_file_t *file);
+
 /* Create a dummy wakeup socket pipe for interrupting the poller
  */
 static apr_status_t create_wakeup_pipe(apr_pollset_t *pollset)
@@ -218,6 +221,12 @@
 {
     return APR_ENOTIMPL;
 }
+
+static apr_status_t apr_file_socket_pipe_close(apr_file_t *file)
+{
+    return APR_ENOTIMPL;
+}
+
 #endif /* WIN32 */
 #else  /* APR_FILES_AS_SOCKETS */
 
@@ -265,11 +274,19 @@
     if (pollset->flags & APR_POLLSET_WAKEABLE) {
         /* Close both sides of the wakeup pipe */
         if (pollset->wakeup_pipe[0]) {
+#if APR_FILES_AS_SOCKETS
             apr_file_close(pollset->wakeup_pipe[0]);
+#else
+            apr_file_socket_pipe_close(pollset->wakeup_pipe[0]);
+#endif
             pollset->wakeup_pipe[0] = NULL;
         }
         if (pollset->wakeup_pipe[1]) {
+#if APR_FILES_AS_SOCKETS
             apr_file_close(pollset->wakeup_pipe[1]);
+#else
+            apr_file_socket_pipe_close(pollset->wakeup_pipe[1]);
+#endif
             pollset->wakeup_pipe[1] = NULL;
         }
     }



Mime
View raw message