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: Tue, 13 Oct 2009 01:03:48 +0200
User-agent: Thunderbird 2.0.0.23 (Windows/20090812)

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]