Hi all,
Thanks again for making UWIN useful. Sorry that I only talk to the list
with bug reports. Here we go again...
I've been running into a deadlock with spawned ksh scripts, but it took
me some time to isolate a reproduction that didn't depend on a ton
of layered "dmake" nonsense. I think I finally got it. :)
The reproduction is fussy to describe but seems reliable. I first noted it
with the 2012-02-29 release, but it exists in the version I am using today:
$ uname -a
UWIN-W7 jpile-w510 5.0/6.1 2012-08-06 i686-64 x64 64/64 UWIN
The problem arises when a ksh instance - started by CreateProcess(), not
a login shell - runs a "#!/bin/ksh" script that in turn uses a pipe
within a $(...) -spawned subshell.
The following script should demonstrate the problem.
-------- K:\>cat \tmp\rep.ksh
#!/bin/ksh -p
print $0
# Hangs on the next line: never prints "hello all".
str=$(echo "hello world"| sed "s/world/all/" )
print $str
--------
Running this from within a UWIN login shell does the expected:
----
$ /tmp/rep.ksh
/tmp/rep.ksh
hello all
$ ksh -c /tmp/rep.ksh
/tmp/rep.ksh
hello all
----
However, here are two ways to cause the deadlock. One, within a ksh
login shell, use the 'runcmd' tool:
----
$ runcmd "ksh -c /tmp/rep.ksh"
/tmp/rep.ksh
----
Two, run from the Windows command prompt:
----
K:\>ksh -c "/tmp/rep.ksh args blah"
/tmp/rep.ksh
----
I initially noted this in our weird build system - we invoke many short bits
of ksh from within WTI dmake (which uses CreateProcess in a very similar
way to runcmd).
When ksh is hung, procexp64 shows the following:
cmd.exe
+- ksh.exe
Command line: ksh -c "/tmp/rep.ksh args blah"
+- ksh.exe
Command line: /bin/ksh -p /tmp/rep.ksh args blah
The following are the active threads in the child-most ksh instance. I don't
have debug symbols for posix.dll handy, so the debugger has so far been an
exercise in futility.
"ksh.exe":
ntdll.dll!ZwWaitForSingleObject+0xa
KERNELBASE.dll!WaitForSingleObjectEx+0x9c
POSIX.dll!setgid+0x991
POSIX.dll!read+0x149
shell11.dll!sh_subfork+0x199e
shell11.dll!sh_subfork+0x39bf
shell11.dll!sh_subfork+0x3be7
shell11.dll!sh_exec+0x216b
shell11.dll!sh_exec+0x305e
shell11.dll!sh_subfork+0xff6
shell11.dll!sh_waitsafe+0x8f7b
shell11.dll!sh_waitsafe+0x483b
shell11.dll!sh_waitsafe+0x784f
shell11.dll!sh_waitsafe+0x83be
shell11.dll!nv_unset+0x19f
shell11.dll!sh_exec+0x9a7
shell11.dll!b_test+0x12d5
shell11.dll!sh_main+0x69e
ksh.exe+0x1541
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
"POSIX.dll!raise"
ntdll.dll!ZwDelayExecution+0xa
KERNELBASE.dll!SleepEx+0xb3
POSIX.dll!raise+0x78f
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
"POSIX.dll!uwin_nt2unixpid"
ntdll.dll!NtWaitForMultipleObjects+0xa
KERNELBASE.dll!GetCurrentThread+0x36
kernel32.dll!WaitForMultipleObjectsEx+0xb3
USER32.dll!PeekMessageW+0x1cd
USER32.dll!MsgWaitForMultipleObjectsEx+0x2a
USER32.dll!MsgWaitForMultipleObjects+0x20
POSIX.dll!seteuid+0x203e
POSIX.dll!uwin_nt2unixpid+0x45e2
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
"POSIX.dll!sigset"
ntdll.dll!NtWaitForMultipleObjects+0xa
KERNELBASE.dll!GetCurrentThread+0x36
kernel32.dll!WaitForMultipleObjects+0xb0
POSIX.dll!sigset+0x9bf
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
"POSIX.dll!grantpt"
ntdll.dll!ZwWaitForSingleObject+0xa
KERNELBASE.dll!WaitForSingleObjectEx+0x9c
POSIX.dll!grantpt+0x8fd
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
"POSIX.dll!brk"
ntdll.dll!NtReadFile+0xa
KERNELBASE.dll!ReadFile+0x7a
kernel32.dll!ReadFile+0x59
POSIX.dll!tcsetpgrp+0x5dca
POSIX.dll!brk+0x2f02
kernel32.dll!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x21
Let me know if I left out anything useful.
-jP
_______________________________________________
uwin-users mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/uwin-users