From: Peter Stephenson <p.stephenson@samsung.com>
To: Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: [BUG?] Very strange behavior, execution of a function is interrupted
Date: Mon, 3 Sep 2018 09:16:52 +0100 [thread overview]
Message-ID: <20180903081654eucas1p13b45b82c1764fd9ccd025ac798a4cfd3~Q1dwaASzl2666526665eucas1p1N@eucas1p1.samsung.com> (raw)
In-Reply-To: <CAKc7PVBNGbkPT-c5KP6VEqL6RboBfocZMATM1g1NUbF4mwQzQQ@mail.gmail.com>
On Sun, 2 Sep 2018 13:53:40 +0200
Sebastian Gniazdowski <sgniazdowski@gmail.com> wrote:
> Guys to state this more simply but also FUD-like: the little `read -q`
> brings up front whole Zle-command-line machinery, with sched, zle -F,
> waiting for inputs (select) on multiple file descriptors, running
> callbacks.
This should stop the function execution feature if we're just reading a
key, but I haven't checked the details work.
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index 2e96ac7..a5cf101 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1518,7 +1518,7 @@ getrestchar_keybuf(void)
* arrive together. If we don't do this the input can
* get stuck if an invalid byte sequence arrives.
*/
- inchar = getbyte(1L, &timeout);
+ inchar = getbyte(1L, &timeout, 1);
/* getbyte deliberately resets lastchar_wide_valid */
lastchar_wide_valid = 1;
if (inchar == EOF) {
@@ -1673,7 +1673,7 @@ addkeybuf(int c)
static int
getkeybuf(int w)
{
- int c = getbyte((long)w, NULL);
+ int c = getbyte((long)w, NULL, 1);
if(c < 0)
return EOF;
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index db70e7d..3487b5d 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -452,7 +452,7 @@ struct ztmout {
*/
static void
-calc_timeout(struct ztmout *tmoutp, long do_keytmout)
+calc_timeout(struct ztmout *tmoutp, long do_keytmout, int full)
{
if (do_keytmout && (keytimeout > 0 || do_keytmout < 0)) {
if (do_keytmout < 0)
@@ -465,7 +465,7 @@ calc_timeout(struct ztmout *tmoutp, long do_keytmout)
} else
tmoutp->tp = ZTM_NONE;
- if (timedfns) {
+ if (full && timedfns) {
for (;;) {
LinkNode tfnode = firstnode(timedfns);
Timedfn tfdat;
@@ -504,7 +504,7 @@ calc_timeout(struct ztmout *tmoutp, long do_keytmout)
/* see calc_timeout for use of do_keytmout */
static int
-raw_getbyte(long do_keytmout, char *cptr)
+raw_getbyte(long do_keytmout, char *cptr, int full)
{
int ret;
struct ztmout tmout;
@@ -519,7 +519,7 @@ raw_getbyte(long do_keytmout, char *cptr)
# endif
#endif
- calc_timeout(&tmout, do_keytmout);
+ calc_timeout(&tmout, do_keytmout, full);
/*
* Handle timeouts and watched fd's. If a watched fd or a function
@@ -684,7 +684,7 @@ raw_getbyte(long do_keytmout, char *cptr)
* reconsider the key timeout from scratch.
* The effect of this is microscopic.
*/
- calc_timeout(&tmout, do_keytmout);
+ calc_timeout(&tmout, do_keytmout, full);
break;
}
/*
@@ -810,7 +810,7 @@ raw_getbyte(long do_keytmout, char *cptr)
# endif
}
/* If looping, need to recalculate timeout */
- calc_timeout(&tmout, do_keytmout);
+ calc_timeout(&tmout, do_keytmout, full);
}
# ifdef HAVE_POLL
zfree(fds, sizeof(struct pollfd) * nfds);
@@ -852,7 +852,7 @@ raw_getbyte(long do_keytmout, char *cptr)
/**/
mod_export int
-getbyte(long do_keytmout, int *timeout)
+getbyte(long do_keytmout, int *timeout, int full)
{
char cc;
unsigned int ret;
@@ -877,7 +877,7 @@ getbyte(long do_keytmout, int *timeout)
for (;;) {
int q = queue_signal_level();
dont_queue_signals();
- r = raw_getbyte(do_keytmout, &cc);
+ r = raw_getbyte(do_keytmout, &cc, full);
restore_queue_signals(q);
if (r == -2) {
/* timeout */
@@ -956,7 +956,7 @@ getbyte(long do_keytmout, int *timeout)
mod_export ZLE_INT_T
getfullchar(int do_keytmout)
{
- int inchar = getbyte((long)do_keytmout, NULL);
+ int inchar = getbyte((long)do_keytmout, NULL, 1);
#ifdef MULTIBYTE_SUPPORT
return getrestchar(inchar, NULL, NULL);
@@ -1021,7 +1021,7 @@ getrestchar(int inchar, char *outstr, int *outcount)
* arrive together. If we don't do this the input can
* get stuck if an invalid byte sequence arrives.
*/
- inchar = getbyte(1L, &timeout);
+ inchar = getbyte(1L, &timeout, 1);
/* getbyte deliberately resets lastchar_wide_valid */
lastchar_wide_valid = 1;
if (inchar == EOF) {
@@ -2139,7 +2139,7 @@ zle_main_entry(int cmd, va_list ap)
do_keytmout = va_arg(ap, long);
timeout = va_arg(ap, int *);
chrp = va_arg(ap, int *);
- *chrp = getbyte(do_keytmout, timeout);
+ *chrp = getbyte(do_keytmout, timeout, 0);
break;
}
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index 898b552..612ac21 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -756,7 +756,7 @@ bracketedstring(void)
while (endesc[endpos]) {
if (current + 1 >= psize)
pbuf = zrealloc(pbuf, psize *= 2);
- if ((next = getbyte(1L, &timeout)) == EOF)
+ if ((next = getbyte(1L, &timeout, 1)) == EOF)
break;
if (!endpos || next != endesc[endpos++])
endpos = (next == *endesc);
@@ -970,7 +970,7 @@ universalargument(char **args)
*
* Hence for now this remains byte-by-byte.
*/
- while ((gotk = getbyte(0L, NULL)) != EOF) {
+ while ((gotk = getbyte(0L, NULL, 1)) != EOF) {
if (gotk == '-' && !digcnt) {
minus = -1;
digcnt++;
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index e0923db..a5ff920 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -131,7 +131,7 @@ vigetkey(void)
char m[3], *str;
Thingy cmd;
- if (getbyte(0L, NULL) == EOF)
+ if (getbyte(0L, NULL, 1) == EOF)
return ZLEEOF;
m[0] = lastchar;
prev parent reply other threads:[~2018-09-03 8:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-31 22:01 Sebastian Gniazdowski
2018-09-01 19:12 ` Sebastian Gniazdowski
2018-09-02 11:53 ` Sebastian Gniazdowski
2018-09-03 8:16 ` Peter Stephenson [this message]
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='20180903081654eucas1p13b45b82c1764fd9ccd025ac798a4cfd3~Q1dwaASzl2666526665eucas1p1N@eucas1p1.samsung.com' \
--to=p.stephenson@samsung.com \
--cc=zsh-workers@zsh.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 public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).