help-emacs-windows
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [h-e-w] Re: emacsclientw.exe bug: random exit status


From: Lennart Borgman
Subject: Re: [h-e-w] Re: emacsclientw.exe bug: random exit status
Date: Tue, 13 Oct 2009 01:28:29 +0200

Hm, you are right ... ;-)

Did you find out how to fix it?


On Tue, Oct 13, 2009 at 1:03 AM, Kai Tetzlaff <address@hidden> wrote:
> Gary Oberbrunner wrote:
>> emacsclientw exits with a random exit status when called from a win32 window 
>> app (such as emacs itself).  The reason is an uninitialized variable in 
>> w32_teardown_window in w32emacsclient.h.  I suspect if "ret" is initialized 
>> to zero (exit status success) in this function it would just work.  I don't 
>> have mingw so I can't compile it here myself, sorry.
>>
>> This is on emacs 23.1.50, also happens on the latest CVS test version.  I'm 
>> using the EmacsW32 patched version on XP, but don't think that matters 
>> either.
>>
>> The symptom is easy to reproduce.  In a shell window inside emacs (I use 
>> cygwin zsh, but any shell will work), run
>>   emacsclient foo || echo BAD
>> then C-x # to close the server buffer, and then look back in the shell 
>> window:
>> % emacsclientw foo || echo BAD
>> Waiting for Emacs...
>> BAD
>> %
>>
>> (I'm sure you already know that "emacsclient", the non-windows version, is 
>> totally broken, gives "Unknown&_command:&"... but emacsclientw is fine so it 
>> doesn't really matter.)
>>
>> Here's the affected code:
>> ===========
>> int
>> w32_teardown_window (int connected)
>> {
>>   int ret;                    <<<<<<<<<<====== FIX HERE to int ret=0;
>>   if (w32_window_app ())
>>     {
>>       w32_check_not_synced();
>>       w32_wait_threads_fin(connected);
>>       ret = W32_SYNC_get_g_exit_value();
>>       DeleteCriticalSection(&g_cs.cs);
>>       return ret;
>>     }
>>   else
>>     ret = g_exit_value;
>>   return ret;
>> }
>> ============
>>
>>
>
> I've also been running into this. Now, when looking at the code of what
> i believe should be the patched version of emacsclient.c, the main
> function looks like this:
>
> int
> main (argc, argv)
>     int argc;
>     char **argv;
> {
>  int i, rl, needlf = 0;
>  char *cwd, *str;
>  char string[BUFSIZ+1];
>  int connected = 0;
>
>  ...
>
>  if ((emacs_socket = set_socket ( alternate_editor ||
> (start_timeout_int > 0) , &islocal)) == INVALID_SOCKET)
>    {
>      ...
>      connected = 1;
>    }
>
>  ...
>
>  int exitval = finish_messages (connected);
>
>  if (connected)
>    exit(exitval);
>  else
>    exit(EXIT_FAILURE);
> }
>
> I.e. if connected is not set to a non-zero value somewhere after it gets
> initialized, main will always exit with EXIT_FAILURE.
>
> The only place in main which sets connected is the if block included
> above. This block is only entered if set_socket returns INVALID_SOCKET
> which seems to be the case only if the server has not been started yet.
> So if you use emacsclient to send files to the server when it is already
> running, it will always seem to be failing.
>
> BR,
> Kai
>
>
>
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]