Implement mch_delay on top of libuv

Needed to temporarily move two static variables from os_unix.c to 'globals.h'
as those are shared by other functions still in os_unix.
This commit is contained in:
Thiago de Arruda
2014-03-24 19:11:51 -03:00
parent ed42c808b6
commit 32f118a47f
9 changed files with 99 additions and 64 deletions

58
src/os/time.c Normal file
View File

@@ -0,0 +1,58 @@
#include <stdint.h>
#include <stdbool.h>
#include <uv.h>
#include "vim.h"
#include "term.h"
static uv_mutex_t delay_mutex;
static uv_cond_t delay_cond;
static void delay(uint64_t ms);
void time_init()
{
uv_mutex_init(&delay_mutex);
uv_cond_init(&delay_cond);
}
void mch_delay(uint64_t ms, bool ignoreinput)
{
int old_tmode;
if (ignoreinput) {
/* Go to cooked mode without echo, to allow SIGINT interrupting us
* here. But we don't want QUIT to kill us (CTRL-\ used in a
* shell may produce SIGQUIT). */
in_mch_delay = true;
old_tmode = curr_tmode;
if (curr_tmode == TMODE_RAW)
settmode(TMODE_SLEEP);
delay(ms);
settmode(old_tmode);
in_mch_delay = false;
} else {
delay(ms);
}
}
static void delay(uint64_t ms)
{
uint64_t hrtime;
int64_t ns = ms * 1000000; /* convert to nanoseconds */
uv_mutex_lock(&delay_mutex);
while (ns > 0) {
hrtime = uv_hrtime();
if (uv_cond_timedwait(&delay_cond, &delay_mutex, ns) == UV_ETIMEDOUT)
break;
ns -= uv_hrtime() - hrtime;
}
uv_mutex_unlock(&delay_mutex);
}