On 2.4 w/ trace enabled, I see an occasional shutdown hang:

000cdc88 7690149d 00000030 00000000 00000000
ntdll_76f40000!ZwWaitForSingleObject+0x15
000cdcf4 74a01194 00000030 ffffffff 00000000
KERNELBASE!WaitForSingleObjectEx+0x98
000cdd0c 74a01148 00000030 ffffffff 00000000
kernel32!WaitForSingleObjectExImplementation+0x75
000cdd20 6eec7329 00000030 ffffffff 000cdd50 kernel32!WaitForSingleObject+0x12
000cdd30 6eec61a9 0071e968 000cde0c 006edf40 libapr_1!apr_thread_mutex_lock+0x29
000cdd50 6eec64b4 006edf40 000cdda0 000cdd70 libapr_1!apr_file_write+0x189
000cdd68 6ff15b5a 0000006b 006edf40 6ff49f10 libapr_1!apr_file_puts+0x24
000cdd7c 6ff15713 000cdda0 00000069 006edf40 libhttpd!write_logline+0x3a
000cfdf8 6ff1533e 6ff49d6c 000001a7 00000000 libhttpd!log_error_core+0x3c3
000cfe2c 6ff2e16c 6ff49d6c 000001a7 00000000 libhttpd!ap_log_error_+0x2e
000cfe58 6ff2e138 0071c8d0 6eec8dd8 00000000 libhttpd!end_gen+0x2c
000cfe60 6eec8dd8 00000000 005aa630 000cfe94 libhttpd!ap_mpm_end_gen_helper+0x68
000cfe70 6eec808b 005aa608 6ff04320 005a8628 libapr_1!run_cleanups+0x18
000cfe94 6eec807b 005aa5f8 6ff04320 ffffffff libapr_1!apr_pool_destroy+0x3b
000cfeb8 00401e67 005a85f0 000cff14 00401be8 libapr_1!apr_pool_destroy+0x2b
000cfec4 00401be8 005a8710 00000000 00000000 httpd!destroy_and_exit_process+0x27
000cff14 00402773 00000003 005a14f0 005a1790 httpd!main+0xbe8
000cff88 74a033aa 7efde000 000cffd4 76f79ef2 httpd!mainCRTStartup+0xe3
000cff94 76f79ef2 7efde000 7a7b5d63 00000000 kernel32!BaseThreadInitThunk+0xe
000cffd4 76f79ec5 00402690 7efde000 00000000
ntdll_76f40000!__RtlUserThreadStart+0x70
000cffec 00000000 00402690 7efde000 00000000
ntdll_76f40000!_RtlUserThreadStart+0x1b

Removing the one TRACE message in end_gen() makes it go away. I have
not backtracked to figure out if the mutex is somehow cleaned up
already, but sharing early in case it makes sense to anyone.

I also noticed that the service.c code will wait forever, would a cap
on that +  an error make sense?  While the stack above was trying to
exit, the -k stop proc was here:

   739:     do {
   740:         Sleep(1000);
   741:         if (!QueryServiceStatus(schService, &globdat.ssStatus))
   742:             return FALSE;
>  743:     } while (globdat.ssStatus.dwCurrentState == pending);
   744:
   745:     return (globdat.ssStatus.dwCurrentState == complete);
   746: }
   747:
   748:






--
Eric Covener
cove...@gmail.com

Reply via email to