all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Jorgen Schaefer <forcer@forcix.cx>
Cc: 18396@debbugs.gnu.org
Subject: bug#18396: 24.3.1; On windows, process-send-string can freeze Emacs
Date: Thu, 04 Sep 2014 05:51:45 +0300	[thread overview]
Message-ID: <83y4u0gkse.fsf@gnu.org> (raw)
In-Reply-To: <20140903212833.14562b90@forcix>

> Date: Wed, 3 Sep 2014 21:28:33 +0200
> From: Jorgen Schaefer <forcer@forcix.cx>
> Cc: 18396@debbugs.gnu.org
> 
> On Wed, 03 Sep 2014 22:01:18 +0300
> Eli Zaretskii <eliz@gnu.org> wrote:
> 
> > > Date: Wed, 3 Sep 2014 20:43:07 +0200
> > > From: Jorgen Schaefer <forcer@forcix.cx>
> > > Cc: 18396@debbugs.gnu.org
> > > 
> > > > Using "/" as the default directory on Windows is a bad idea, as
> > > > that is not a fully-qualified absolute file name.
> > > 
> > > What would be the equivalent for "out of the way and not blocking
> > > any mount point" (or equivalent) on Windows?
> > 
> > I might have a suggestion, if you explain what "out of the way" and
> > "not blocking any mount points" mean.
> 
> The primary reason Elpy starts the process in "/" is to avoid
> accidental imports of Python modules. As the process is started from a
> Python buffer, there often are Python files in the current directory,
> which can accidentally be imported. "/" is unlikely to have Python
> modules.

Why not use ~/, then?

> Also, a current directory of "/" means the process won't
> accidentally block a mount point, much like why daemons chdir to /. I'm
> not sure if this concept makes sense in Windows.

(expand-file-name "/") should do what you want, I think.

> > > > Looks like the write to the pipe never returned.  This could be
> > > > because the pipe is full and is not being read from the other end
> > > > (Windows pipes have 4K buffers, and you show above more than 6K of
> > > > data).
> > > 
> > > That is quite likely the explanation. The Python process does the
> > > equivalent of a REPL, reading one RPC call, evaluating it, and
> > > writing the response. If in the duration of that evaluation Emacs
> > > sends more than 4k of data, it will hang. If the response is larger
> > > than 4k, Python in turn will hang. Resulting in a deadlock.
> > > 
> > > Am I missing something?
> > 
> > I'd expect Python to continue reading from the pipe once it evaluated
> > one call and sent back the response.  It should see that more input is
> > available and continue reading.
> 
> But if the sending of the response runs into the same problem?

Each direction of the pipe has its own separate buffering, so this is
unlikely.

> The response can contain docstrings and can easily be larger than
> 4k, so it's conceivable that Python sends more than 4k of data as
> well, which would block the Python process, too? And thus prevent it
> from reading, which keeps Emacs blocked?

Emacs reads in a separate thread, so again, unlikely.

> > Could this be an end-of-line format issue?  Are you sure the commands
> > used from Emacs side produce Windows-style CRLF EOLs?  Or maybe they
> > do, but Python expects Unix-style newline-only EOLs (maybe it's a
> > Cygwin or MSYS Python, for example)?  A wrong EOL format might cause
> > Python to fail to realize it was handed a full line of input.
> 
> Unlikely. The RPC calls work perfectly fine most of the time

Perhaps this user has a different kind of Python than others.

> > > Does Emacs have a chance to check for a pipe to be writable before
> > > doing so? The whole process blocking like this feels a bit weird.
> > 
> > I don't know how to do such a check with pipes on Windows.  More
> > importantly, how would that help?  The pipe will fill up anyway, and
> > the communications with Python will stop.  Being able to interrupt
> > with C-g vs killing the subprocess is not such a big win, IMO.
> 
> Well, if the deadlock hypothesis is correct, Emacs would check if the
> pipe is writable, notice that it isn't and keep checking, to notice
> that the pipe is readable, read data, and thus break the deadlock.

See above: there's no interconnection between reading and writing, so
that's not the problem.





  reply	other threads:[~2014-09-04  2:51 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-03 16:58 bug#18396: 24.3.1; On windows, process-send-string can freeze Emacs Jorgen Schaefer
2014-09-03 18:03 ` Eli Zaretskii
2014-09-03 18:43   ` Jorgen Schaefer
2014-09-03 19:01     ` Eli Zaretskii
2014-09-03 19:28       ` Jorgen Schaefer
2014-09-04  2:51         ` Eli Zaretskii [this message]
2014-09-09 18:45           ` Eli Zaretskii
2014-11-01 15:37 ` bug#18396: No further updates Jorgen Schaefer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=83y4u0gkse.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=18396@debbugs.gnu.org \
    --cc=forcer@forcix.cx \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.