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.
next prev parent 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.