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