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

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

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


From: Kai Tetzlaff
Subject: [h-e-w] Re: emacsclientw.exe bug: random exit status
Date: Thu, 15 Oct 2009 10:33:23 +0200
User-agent: Thunderbird 2.0.0.23 (Windows/20090812)

> Hah, there's a lot of stuff in main which i did not yet have a closer
> look at ;-) and i'm not really familiar with the code. But (as a quick
> shot) how about checking emacs_socket in addition to connected:
> 
> if (connected || emacs_socket != INVALID_SOCKET) {
>   exit(exitval);
> else
>   exit(EXIT_FAILURE);
> 
> Maybe even forgetting about connected at all...

I've bow compiled a version with the fix above. It's working in first
tests. I'll do some further testing and let you know how it goes. I can
also email the compiled binaries (emacsclient/emacsclientw) to anyone
who's interested.

> 
> Not sure though if this would work for all cases (or at all). If you
> want i can have a closer look. But then i would probably also like to
> set up a dev env to compile emacs on windows. Any good tips how to
> start? I already have msys/mingw running and have been using it to port
> some other stuff to windows ...
> 
> /Kai
> 
>> 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]