On 21.01.2009 18:33, William A. Rowe, Jr. wrote:
William A. Rowe, Jr. wrote:
Rainer Jung wrote:
Could be, that there's something wrong with the code that copies the
listen sockets from the main process to the child.
Exactly; one of the primary possibilities is that a well documented API,
WSADuplicateSocket does not behave for a given socket provider.

It's also possible that there is an [un]obvious bug.  I hate this particular
tracing, but I'm off to check this out from the parent/child this afternoon.
Yes - my own testing initially has been -X - it explains our discrepancy.

Looks like I solved it:

In r730828 Win9x code was removed. At least in one function, the Win9x code was kept and instead the more modern code was removed, namely in file mpm_winnt.c, function get_listeners_from_parent():

@@ -480,30 +466,12 @@
             exit(APEXIT_CHILDINIT);
         }

-        if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
-            HANDLE hProcess = GetCurrentProcess();
-            HANDLE dup;
-            if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup,
-                                0, FALSE, DUPLICATE_SAME_ACCESS)) {
...
-            }
-        }
-        else {
...
- if (!SetHandleInformation((HANDLE)nsd, HANDLE_FLAG_INHERIT, 0)) {
...
-            }
+        if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup,
+                            0, FALSE, DUPLICATE_SAME_ACCESS)) {
+            closesocket(nsd);
+            nsd = (SOCKET) dup;
         }
+
         apr_os_sock_put(&lr->sd, &nsd, s->process->pool);
     }

In effect, the "if" part is still there and the else part has been removed. As far as MSDN tells me, osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS is true for Win9x, so the if part is the one to remove, and the else part is the one we might want to keep.

When I undo this change, it works again :)

By adding some logging, I see, that my XP system takes the else branch.

Regards,

Rainer

Reply via email to