diff options
| author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-07-24 10:38:35 -0300 | 
|---|---|---|
| committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-08-13 07:41:04 -0300 | 
| commit | 3f5af6c1c4815c5fb2a492292212b244abe23759 (patch) | |
| tree | 617a8b2348ad58b4c2e67c9de30349f789e9f223 /src | |
| parent | ccdeb91e1206f38773664979bf03694213a2ba80 (diff) | |
| download | rneovim-3f5af6c1c4815c5fb2a492292212b244abe23759.tar.gz rneovim-3f5af6c1c4815c5fb2a492292212b244abe23759.tar.bz2 rneovim-3f5af6c1c4815c5fb2a492292212b244abe23759.zip  | |
loop: Simplify loop.c and move some code to input.c
- Declare poll timer in Loop structure instead of a loop_poll_events local
  variable.
- Move deferred event management to input.c
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/edit.c | 4 | ||||
| -rw-r--r-- | src/nvim/event/loop.c | 58 | ||||
| -rw-r--r-- | src/nvim/event/loop.h | 3 | ||||
| -rw-r--r-- | src/nvim/ex_getln.c | 5 | ||||
| -rw-r--r-- | src/nvim/normal.c | 5 | ||||
| -rw-r--r-- | src/nvim/os/input.c | 22 | ||||
| -rw-r--r-- | src/nvim/terminal.c | 5 | 
7 files changed, 39 insertions, 63 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 390d62210b..3982e32c2f 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -601,11 +601,11 @@ edit (       * Get a character for Insert mode.  Ignore K_IGNORE.       */      lastc = c;                          /* remember previous char for CTRL-D */ -    loop_enable_deferred_events(&loop); +    input_enable_events();      do {        c = safe_vgetc();      } while (c == K_IGNORE); -    loop_disable_deferred_events(&loop); +    input_disable_events();      if (c == K_EVENT) {        c = lastc; diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c index d90565002e..67572c4f30 100644 --- a/src/nvim/event/loop.c +++ b/src/nvim/event/loop.c @@ -20,6 +20,7 @@ void loop_init(Loop *loop, void *data)    loop->children_stop_requests = 0;    uv_signal_init(&loop->uv, &loop->children_watcher);    uv_timer_init(&loop->uv, &loop->children_kill_timer); +  uv_timer_init(&loop->uv, &loop->poll_timer);  }  void loop_poll_events(Loop *loop, int ms) @@ -30,52 +31,28 @@ void loop_poll_events(Loop *loop, int ms)      abort();  // Should not re-enter uv_run    } -  bool wait = true; -  uv_timer_t timer; +  uv_run_mode mode = UV_RUN_ONCE;    if (ms > 0) { -    uv_timer_init(&loop->uv, &timer);      // Use a repeating timeout of ms milliseconds to make sure      // we do not block indefinitely for I/O. -    uv_timer_start(&timer, timer_cb, (uint64_t)ms, (uint64_t)ms); +    uv_timer_start(&loop->poll_timer, timer_cb, (uint64_t)ms, (uint64_t)ms);    } else if (ms == 0) {      // For ms == 0, we need to do a non-blocking event poll by      // setting the run mode to UV_RUN_NOWAIT. -    wait = false; +    mode = UV_RUN_NOWAIT;    } -  if (wait) { -    loop_run_once(loop); -  } else { -    loop_run_nowait(loop); -  } +  uv_run(&loop->uv, mode);    if (ms > 0) { -    // Ensure the timer handle is closed and run the event loop -    // once more to let libuv perform it's cleanup -    uv_timer_stop(&timer); -    uv_close((uv_handle_t *)&timer, NULL); -    loop_run_nowait(loop); +    uv_timer_stop(&loop->poll_timer);    }    recursive--;  // Can re-enter uv_run now    process_events_from(loop->immediate_events);  } -bool loop_has_deferred_events(Loop *loop) -{ -  return loop->deferred_events_allowed && !kl_empty(loop->deferred_events); -} - -void loop_enable_deferred_events(Loop *loop) -{ -  ++loop->deferred_events_allowed; -} - -void loop_disable_deferred_events(Loop *loop) -{ -  --loop->deferred_events_allowed; -}  // Queue an event  void loop_push_event(Loop *loop, Event event, bool deferred) @@ -85,7 +62,7 @@ void loop_push_event(Loop *loop, Event event, bool deferred)    // of the queues, the event would only be processed after the poll    // returns(user hits a key for example). To avoid this scenario, we call    // uv_stop when a event is enqueued. -  loop_stop(loop); +  uv_stop(&loop->uv);    kl_push(Event, deferred ? loop->deferred_events : loop->immediate_events,        event);  } @@ -96,30 +73,11 @@ void loop_process_event(Loop *loop)  } -void loop_run(Loop *loop) -{ -  uv_run(&loop->uv, UV_RUN_DEFAULT); -} - -void loop_run_once(Loop *loop) -{ -  uv_run(&loop->uv, UV_RUN_ONCE); -} - -void loop_run_nowait(Loop *loop) -{ -  uv_run(&loop->uv, UV_RUN_NOWAIT); -} - -void loop_stop(Loop *loop) -{ -  uv_stop(&loop->uv); -} -  void loop_close(Loop *loop)  {    uv_close((uv_handle_t *)&loop->children_watcher, NULL);    uv_close((uv_handle_t *)&loop->children_kill_timer, NULL); +  uv_close((uv_handle_t *)&loop->poll_timer, NULL);    do {      uv_run(&loop->uv, UV_RUN_DEFAULT);    } while (uv_loop_close(&loop->uv)); diff --git a/src/nvim/event/loop.h b/src/nvim/event/loop.h index 5eb4d32ca8..340e096fec 100644 --- a/src/nvim/event/loop.h +++ b/src/nvim/event/loop.h @@ -25,10 +25,9 @@ KLIST_INIT(Event, Event, _noop)  typedef struct loop {    uv_loop_t uv;    klist_t(Event) *deferred_events, *immediate_events; -  int deferred_events_allowed;    klist_t(WatcherPtr) *children;    uv_signal_t children_watcher; -  uv_timer_t children_kill_timer; +  uv_timer_t children_kill_timer, poll_timer;    size_t children_stop_requests;  } Loop; diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 785db1dbd1..f32aee809a 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -62,6 +62,7 @@  #include "nvim/tag.h"  #include "nvim/window.h"  #include "nvim/ui.h" +#include "nvim/os/input.h"  #include "nvim/os/os.h"  #include "nvim/event/loop.h" @@ -298,11 +299,11 @@ getcmdline (      /* Get a character.  Ignore K_IGNORE, it should not do anything, such       * as stop completion. */ -    loop_enable_deferred_events(&loop); +    input_enable_events();      do {        c = safe_vgetc();      } while (c == K_IGNORE); -    loop_disable_deferred_events(&loop); +    input_disable_events();      if (c == K_EVENT) {        loop_process_event(&loop); diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 95e1c3d113..dd9a4230b5 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -63,6 +63,7 @@  #include "nvim/window.h"  #include "nvim/event/loop.h"  #include "nvim/os/time.h" +#include "nvim/os/input.h"  /*   * The Visual area is remembered for reselection. @@ -487,9 +488,9 @@ normal_cmd (    /*     * Get the command character from the user.     */ -  loop_enable_deferred_events(&loop); +  input_enable_events();    c = safe_vgetc(); -  loop_disable_deferred_events(&loop); +  input_disable_events();    if (c == K_EVENT) {      loop_process_event(&loop); diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index b0e0f57e60..b0263f18d0 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -33,6 +33,7 @@ static Stream read_stream = {.closed = true};  static RBuffer *input_buffer = NULL;  static bool input_eof = false;  static int global_fd = 0; +static int events_enabled = 0;  #ifdef INCLUDE_GENERATED_DECLARATIONS  # include "os/input.c.generated.h" @@ -110,8 +111,8 @@ int os_inchar(uint8_t *buf, int maxlen, int ms, int tb_change_cnt)      return (int)rbuffer_read(input_buffer, (char *)buf, (size_t)maxlen);    } -  // If there are deferred events, return the keys directly -  if (loop_has_deferred_events(&loop)) { +  // If there are events, return the keys directly +  if (pending_events()) {      return push_event_key(buf, maxlen);    } @@ -136,6 +137,16 @@ void os_breakcheck(void)    }  } +void input_enable_events(void) +{ +  events_enabled++; +} + +void input_disable_events(void) +{ +  events_enabled--; +} +  /// Test whether a file descriptor refers to a terminal.  ///  /// @param fd File descriptor. @@ -358,7 +369,7 @@ static bool input_ready(void)  {    return typebuf_was_filled ||                 // API call filled typeahead           rbuffer_size(input_buffer) ||         // Input buffer filled -         loop_has_deferred_events(&loop);      // Events must be processed +         pending_events();                     // Events must be processed  }  // Exit because of an input read error. @@ -369,3 +380,8 @@ static void read_error_exit(void)    STRCPY(IObuff, _("Vim: Error reading input, exiting...\n"));    preserve_exit();  } + +static bool pending_events(void) +{ +  return events_enabled && !kl_empty(loop.deferred_events); +} diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 47fef692db..0285ce72d4 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -69,6 +69,7 @@  #include "nvim/fileio.h"  #include "nvim/event/loop.h"  #include "nvim/event/time.h" +#include "nvim/os/input.h"  #include "nvim/api/private/helpers.h"  #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -354,13 +355,13 @@ void terminal_enter(bool process_deferred)    while (term->buf == curbuf) {      if (process_deferred) { -      loop_enable_deferred_events(&loop); +      input_enable_events();      }      c = safe_vgetc();      if (process_deferred) { -      loop_disable_deferred_events(&loop); +      input_disable_events();      }      switch (c) {  | 
