summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnand Avati <avati@gluster.com>2010-07-12 08:13:08 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-07-12 06:59:25 -0700
commit9bee476eabb5034a27e994008a12ef684755d76c (patch)
treeec3dcb8be8f1f2c8f95e2e97ee9f7103473d3866
parentce8cee660a5cda88ea58e362be01e50cbccfff27 (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.c30
-rw-r--r--cli/src/cli.h1
2 files changed, 31 insertions, 0 deletions
diff --git a/cli/src/cli-rl.c b/cli/src/cli-rl.c
index bc2e80eba04..e0061d12515 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 a53b6a9e1e5..808e9236024 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 */