all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "João Távora" <joaotavora@gmail.com>
To: emacs-devel@gnu.org
Subject: A question regarding sit-for (and while-no-input)
Date: Thu, 06 Sep 2018 12:29:26 +0100	[thread overview]
Message-ID: <87k1nyzwx5.fsf@gmail.com> (raw)

Hi,

In a couple of my extensions (jsonrpc.el and sly), I am using a
technique for synchronously fetching completion candidates from an
external process while still maintaining high responsiveness to the
user's input.

This is very useful for working with company.el, for example.  If the
user types the first few letters of a completion, the system goes to
work immediately fetching candidates.  If the candidates don't arrive in
time, they are silently discarded.

I am running into a bug in my program, which only happens sometimes and
is hard to reproduce.  I don't know how to fix it.

I hope this simplified snippet from the function jsonrpc-request in
lisp/jsonrpc.el illustrates the problem sufficiently for someone to
provide some hint as to what might be going askew:

   (let ((tag (some-unique-symbol))
         (cancelled nil))
     (catch tag
    ...
      (lambda (...) (unless cancelled (throw tag result-or-error)))
    ...
      (cond (cancel-on-input
             (while (sit-for 30))
             (setq cancelled t)
             `(cancelled ,cancel-on-input-retval))
            (t (while t (accept-process-output nil 30)))))
    ...
   )

'cancel-on-input' is a parameter to jsonrpc-request.  If the caller
provides it as 't', it means he/she wants that call to block as long as
there is no input from the user.  A response from the server before that
happens, which takes the form of a call to anonymous lambda, will also
cause the function to return.

Most of the time, this works flawlessly, as intended.  But the behaviour
I'm witnessing is that (throw tag) sometimes happens after the (catch
tag ...) has been torn down.

What am I missing?? If the catch has been torn down then surely (setq
cancelled t) must have run, right?  Otherwise I would be seeing an error
from sit-for, which I'm not.

Thanks,
João







             reply	other threads:[~2018-09-06 11:29 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-06 11:29 João Távora [this message]
2018-09-06 11:59 ` A question regarding sit-for (and while-no-input) João Távora
2018-09-06 12:33   ` Stefan Monnier
2018-10-04 16:33     ` João Távora
2018-10-05 12:36       ` Stefan Monnier
2018-10-06 10:35         ` João Távora

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=87k1nyzwx5.fsf@gmail.com \
    --to=joaotavora@gmail.com \
    --cc=emacs-devel@gnu.org \
    /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.