>>>>> "Andy" == Andy Piper <andyp(a)beasys.com> writes:
Andy> Vin, I think this one should go in although it hasn't been
Andy> sent to xemacs-patches. However, there maybe some wierd
Andy> interaction with Adrian's process patch that should be
Andy> checked. Adrian, does your patch include this? Have you
No
Andy> tried this patch with yours?
No
I'll try to take a lok at this this evening.
Adrian
Andy> andy
Andy> At 12:44 AM 10/20/99 -0400, Mike Alexander wrote:
>> A few weeks ago I sent a message to the list asking if anyone knew what was
>> causing the MKS Toolkit Korn shell to fail when used with the XEmacs shell
>> command. If you recall any attempt to invoke a sub shell produced the
>> message "Forked child base mismatch" and pipes didn't work (they appeared
>> to cause the shell to hang). I think I've fixed both problems and the
>> shell seems to be working ok now.
>>
>> The first problem was happening because nt-create-process creates the
>> process suspended and then uses run-in-other-process to issue a call to
>> SetConsoleCtrlHandler in the new process before it lets it run. Apparently
>> this call is doing something (probably allocating memory) which confuses
>> the MKS shell. I fixed this by deferring the call to SetConsoleCtrlHandler
>> until after the shell has had a chance to initialize. The only way I could
>> figure out to do this without changing core XEmacs was to use the
>> update_status_if_terminated call back which is a bit of a kludge. If
>> someone knows a better way, let me know.
>>
>> The other problem turned out to be caused by the fact that XEmacs was
>> passing the same handle for both StdOutput and StdError. When the shell
>> created the pipe between the two commands for something like "ps | sort" it
>> got confused because it wasn't expecting two copies of the same
>> handle. The net result was that it lost it's connection to StdError so no
>> further prompts appeared and I thought the shell had hung. This was easy
>> to fix by simply making StdError a copy of the StdOutput handle instead of
>> passing the same handle for both.
>>
>> Here is the patch that fixes both problems I'd appreciate it if someone
>> would give it a try and see if it breaks anything. I've tried this with
>> the current CVS source as of last night.
>>
>>
>> Mike Alexander Arbortext, Inc.
>> mta(a)arbortext.com +1-734-327-6803
>>
>> --- process-nt.c 1999/09/11 08:57:25 1.11.2.5
>> +++ process-nt.c 1999/10/19 08:24:07
>> @@ -53,6 +53,7 @@
>> struct nt_process_data
>> {
>> HANDLE h_process;
>> + int need_enable_child_signals;
>> };
>>
>> #define NT_DATA(p) ((struct nt_process_data*)((p)->process_data))
>> @@ -421,7 +422,7 @@
>> Lisp_Object *argv, int nargv,
>> Lisp_Object program, Lisp_Object cur_dir)
>> {
>> - HANDLE hmyshove, hmyslurp, hprocin, hprocout;
>> + HANDLE hmyshove, hmyslurp, hprocin, hprocout, hprocerr;
>> LPTSTR command_line;
>> BOOL do_io, windowed;
>> char *proc_env;
>> @@ -472,6 +473,10 @@
>> CreatePipe (&hprocin, &hmyshove, &sa, 0);
>> CreatePipe (&hmyslurp, &hprocout, &sa, 0);
>>
>> + /* Duplicate the stdout handle for use as stderr */
>> + DuplicateHandle(GetCurrentProcess(), hprocout, GetCurrentProcess(),
>> &hprocerr,
>> + 0, TRUE, DUPLICATE_SAME_ACCESS);
>> +
>> /* Stupid Win32 allows to create a pipe with *both* ends either
>> inheritable or not. We need process ends inheritable, and local
>> ends not inheritable. */
>> @@ -599,7 +604,7 @@
>> {
>> si.hStdInput = hprocin;
>> si.hStdOutput = hprocout;
>> - si.hStdError = hprocout;
>> + si.hStdError = hprocerr;
>> si.dwFlags |= STARTF_USESTDHANDLES;
>> }
>>
>> @@ -614,6 +619,7 @@
>> /* These just have been inherited; we do not need a copy */
>> CloseHandle (hprocin);
>> CloseHandle (hprocout);
>> + CloseHandle (hprocerr);
>> }
>>
>> /* Handle process creation failure */
>> @@ -640,12 +646,18 @@
>> CloseHandle (pi.hProcess);
>> }
>>
>> - if (!windowed)
>> - enable_child_signals (pi.hProcess);
>> -
>> ResumeThread (pi.hThread);
>> CloseHandle (pi.hThread);
>>
>> + /* Remember to enable child signals later if this is not a windowed
>> + app. Can't do it right now because that screws up the MKS Toolkit
>> + shell. */
>> + if (!windowed)
>> + {
>> + NT_DATA(p)->need_enable_child_signals = 10;
>> + kick_status_notify ();
>> + }
>> +
>> /* Hack to support Windows 95 negative pids */
>> return ((int)pi.dwProcessId < 0
>> ? -(int)pi.dwProcessId : (int)pi.dwProcessId);
>> @@ -664,6 +676,18 @@
>> nt_update_status_if_terminated (struct Lisp_Process* p)
>> {
>> DWORD exit_code;
>> +
>> + if (NT_DATA(p)->need_enable_child_signals > 1)
>> + {
>> + NT_DATA(p)->need_enable_child_signals -= 1;
>> + kick_status_notify ();
>> + }
>> + else if (NT_DATA(p)->need_enable_child_signals == 1)
>> + {
>> + enable_child_signals(NT_DATA(p)->h_process);
>> + NT_DATA(p)->need_enable_child_signals = 0;
>> + }
>> +
>> if (GetExitCodeProcess (NT_DATA(p)->h_process, &exit_code)
>> && exit_code != STILL_ACTIVE)
>> {
>> @@ -764,6 +788,14 @@
>> int current_group, int nomsg)
>> {
>> struct Lisp_Process *p = XPROCESS (proc);
>> +
>> + /* Enable child signals if necessary. This may lose the first
>> + but it's better than nothing. */
>> + if (NT_DATA(p)->need_enable_child_signals > 0)
>> + {
>> + enable_child_signals(NT_DATA(p)->h_process);
>> + NT_DATA(p)->need_enable_child_signals = 0;
>> + }
>>
>> /* Signal error if SIGNO cannot be sent */
>> validate_signal_number (signo);
>>
>>
>>
Andy> --------------------------------------------------------------
Andy> Dr Andy Piper
Andy> Senior Consultant Architect, BEA Systems Ltd