Welcome! Log In Create A New Profile

Advanced

[njs] Shell: improved working with libedit.

Dmitry Volyntsev
May 20, 2023 12:32AM
details: https://hg.nginx.org/njs/rev/5889afe2a4b7
branches:
changeset: 2126:5889afe2a4b7
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Fri May 19 20:22:16 2023 -0700
description:
Shell: improved working with libedit.

Previously, libedit unlike GNU readline does not reinstall
rl_callback_handler_install handler after the handler was called. As a
result make shell_test executed ~20 times longer with libedit.

The fix is to reinstall the rl_callback_handler_install handler
explicitely every time the handler is invoked.

diffstat:

external/njs_shell.c | 21 ++++++++++++++++-----
test/shell_test.exp | 10 +++++-----
2 files changed, 21 insertions(+), 10 deletions(-)

diffs (81 lines):

diff -r 7cd80c77433b -r 5889afe2a4b7 external/njs_shell.c
--- a/external/njs_shell.c Fri May 19 20:22:15 2023 -0700
+++ b/external/njs_shell.c Fri May 19 20:22:16 2023 -0700
@@ -1087,6 +1087,7 @@ njs_cb_line_handler(char *line_in)
line.length = njs_strlen(line.start);

if (line.length == 0) {
+ rl_callback_handler_install(">> ", njs_cb_line_handler);
return;
}

@@ -1097,6 +1098,10 @@ njs_cb_line_handler(char *line_in)
njs_running = NJS_ERROR;
}

+ if (ret == NJS_OK) {
+ rl_callback_handler_install(">> ", njs_cb_line_handler);
+ }
+
free(line.start);
}

@@ -1104,9 +1109,11 @@ njs_cb_line_handler(char *line_in)
static njs_int_t
njs_interactive_shell(njs_opts_t *opts, njs_vm_opt_t *vm_options)
{
- fd_set fds;
- njs_vm_t *vm;
- njs_int_t ret;
+ int flags;
+ fd_set fds;
+ njs_vm_t *vm;
+ njs_int_t ret;
+ struct timeval timeout;

if (njs_editline_init() != NJS_OK) {
njs_stderror("failed to init completions\n");
@@ -1126,13 +1133,17 @@ njs_interactive_shell(njs_opts_t *opts,

rl_callback_handler_install(">> ", njs_cb_line_handler);

+ flags = fcntl(STDIN_FILENO, F_GETFL, 0);
+ fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
+
njs_running = NJS_OK;

while (njs_running == NJS_OK) {
FD_ZERO(&fds);
- FD_SET(fileno(rl_instream), &fds);
+ FD_SET(STDIN_FILENO, &fds);
+ timeout = (struct timeval) {1, 0};

- ret = select(FD_SETSIZE, &fds, NULL, NULL, NULL);
+ ret = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
if (ret < 0 && errno != EINTR) {
njs_stderror("select() failed\n");
njs_running = NJS_ERROR;
diff -r 7cd80c77433b -r 5889afe2a4b7 test/shell_test.exp
--- a/test/shell_test.exp Fri May 19 20:22:15 2023 -0700
+++ b/test/shell_test.exp Fri May 19 20:22:16 2023 -0700
@@ -100,15 +100,15 @@ njs_test {
}

njs_test {
- {"O\t"
- "O\a*bject"}
+ {"Type\t"
+ "Type\a*Error"}
{"\t\t"
- "Object.create*Object.isSealed"}
+ "TypeError.length"}
}

njs_test {
- {"Object.\t\t"
- "Object.create*Object.isSealed"}
+ {"TypeError.\t\t"
+ "TypeError.length*TypeError.prototype"}
}

njs_test {
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Shell: improved working with libedit.

Dmitry Volyntsev 202 May 20, 2023 12:32AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 124
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready