diff options
author | Anand Avati <avati@gluster.com> | 2010-07-12 08:13:08 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2010-07-12 06:59:25 -0700 |
commit | 9bee476eabb5034a27e994008a12ef684755d76c (patch) | |
tree | ec3dcb8be8f1f2c8f95e2e97ee9f7103473d3866 | |
parent | ce8cee660a5cda88ea58e362be01e50cbccfff27 (diff) |
cli: move readline to separate thread
move readline handling to a synchronous input thread to avoid deadlocks
with poll loop
Signed-off-by: Anand V. Avati <avati@blackhole.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 971 (dynamic volume management)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971
-rw-r--r-- | cli/src/cli-rl.c | 30 | ||||
-rw-r--r-- | cli/src/cli.h | 1 |
2 files changed, 31 insertions, 0 deletions
diff --git a/cli/src/cli-rl.c b/cli/src/cli-rl.c index bc2e80eba..e0061d125 100644 --- a/cli/src/cli-rl.c +++ b/cli/src/cli-rl.c @@ -336,6 +336,28 @@ complete_none (const char *txt, int times) } +void * +cli_rl_input (void *_data) +{ + struct cli_state *state = NULL; + char *line = NULL; + + state = _data; + + for (;;) { + line = readline (state->prompt); + if (!line) + break; + + cli_rl_process_line (line); + + free (line); + } + + return NULL; +} + + int cli_rl_enable (struct cli_state *state) { @@ -345,6 +367,14 @@ cli_rl_enable (struct cli_state *state) rl_attempted_completion_function = cli_rl_autocomplete; rl_completion_entry_function = complete_none; + if (!state->rl_async) { + ret = pthread_create (&state->input, NULL, + cli_rl_input, state); + if (ret == 0) + state->rl_enabled = 1; + goto out; + } + ret = event_register (state->ctx->event_pool, 0, cli_rl_stdin, state, 1, 0); if (ret == -1) diff --git a/cli/src/cli.h b/cli/src/cli.h index a53b6a9e1..808e92360 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -85,6 +85,7 @@ struct cli_state { /* terminal I/O */ const char *prompt; int rl_enabled; + int rl_async; int rl_processing; /* autocompletion state */ |