mirror of
https://github.com/tmux/tmux.git
synced 2025-01-07 16:28:48 +00:00
Use CLOCK_MONOTONIC for timer measurement and add a timestamp to control
mode %output blocks.
This commit is contained in:
parent
563b7331da
commit
f3931497f8
24
control.c
24
control.c
@ -45,6 +45,7 @@
|
|||||||
struct control_block {
|
struct control_block {
|
||||||
size_t size;
|
size_t size;
|
||||||
char *line;
|
char *line;
|
||||||
|
uint64_t t;
|
||||||
|
|
||||||
TAILQ_ENTRY(control_block) entry;
|
TAILQ_ENTRY(control_block) entry;
|
||||||
TAILQ_ENTRY(control_block) all_entry;
|
TAILQ_ENTRY(control_block) all_entry;
|
||||||
@ -152,6 +153,21 @@ control_add_pane(struct client *c, struct window_pane *wp)
|
|||||||
return (cp);
|
return (cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get actual pane for this client. */
|
||||||
|
static struct window_pane *
|
||||||
|
control_window_pane(struct client *c, u_int pane)
|
||||||
|
{
|
||||||
|
struct window_pane *wp;
|
||||||
|
|
||||||
|
if (c->session == NULL)
|
||||||
|
return (NULL);
|
||||||
|
if ((wp = window_pane_find_by_id(pane)) == NULL)
|
||||||
|
return (NULL);
|
||||||
|
if (winlink_find_by_window(&c->session->windows, wp->window) == NULL)
|
||||||
|
return (NULL);
|
||||||
|
return (wp);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reset control offsets. */
|
/* Reset control offsets. */
|
||||||
void
|
void
|
||||||
control_reset_offsets(struct client *c)
|
control_reset_offsets(struct client *c)
|
||||||
@ -253,6 +269,7 @@ control_write(struct client *c, const char *fmt, ...)
|
|||||||
cb = xcalloc(1, sizeof *cb);
|
cb = xcalloc(1, sizeof *cb);
|
||||||
xvasprintf(&cb->line, fmt, ap);
|
xvasprintf(&cb->line, fmt, ap);
|
||||||
TAILQ_INSERT_TAIL(&cs->all_blocks, cb, all_entry);
|
TAILQ_INSERT_TAIL(&cs->all_blocks, cb, all_entry);
|
||||||
|
cb->t = get_timer();
|
||||||
|
|
||||||
log_debug("%s: %s: storing line: %s", __func__, c->name, cb->line);
|
log_debug("%s: %s: storing line: %s", __func__, c->name, cb->line);
|
||||||
bufferevent_enable(cs->write_event, EV_WRITE);
|
bufferevent_enable(cs->write_event, EV_WRITE);
|
||||||
@ -290,6 +307,7 @@ control_write_output(struct client *c, struct window_pane *wp)
|
|||||||
cb = xcalloc(1, sizeof *cb);
|
cb = xcalloc(1, sizeof *cb);
|
||||||
cb->size = new_size;
|
cb->size = new_size;
|
||||||
TAILQ_INSERT_TAIL(&cs->all_blocks, cb, all_entry);
|
TAILQ_INSERT_TAIL(&cs->all_blocks, cb, all_entry);
|
||||||
|
cb->t = get_timer();
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(&cp->blocks, cb, entry);
|
TAILQ_INSERT_TAIL(&cp->blocks, cb, entry);
|
||||||
log_debug("%s: %s: new output block of %zu for %%%u", __func__, c->name,
|
log_debug("%s: %s: new output block of %zu for %%%u", __func__, c->name,
|
||||||
@ -446,15 +464,13 @@ static int
|
|||||||
control_write_pending(struct client *c, struct control_pane *cp, size_t limit)
|
control_write_pending(struct client *c, struct control_pane *cp, size_t limit)
|
||||||
{
|
{
|
||||||
struct control_state *cs = c->control_state;
|
struct control_state *cs = c->control_state;
|
||||||
struct session *s = c->session;
|
|
||||||
struct window_pane *wp = NULL;
|
struct window_pane *wp = NULL;
|
||||||
struct evbuffer *message = NULL;
|
struct evbuffer *message = NULL;
|
||||||
size_t used = 0, size;
|
size_t used = 0, size;
|
||||||
struct control_block *cb, *cb1;
|
struct control_block *cb, *cb1;
|
||||||
|
|
||||||
if (s == NULL ||
|
wp = control_window_pane(c, cp->pane);
|
||||||
(wp = window_pane_find_by_id(cp->pane)) == NULL ||
|
if (wp == NULL) {
|
||||||
winlink_find_by_window(&s->windows, wp->window) == NULL) {
|
|
||||||
TAILQ_FOREACH_SAFE(cb, &cp->blocks, entry, cb1) {
|
TAILQ_FOREACH_SAFE(cb, &cp->blocks, entry, cb1) {
|
||||||
TAILQ_REMOVE(&cp->blocks, cb, entry);
|
TAILQ_REMOVE(&cp->blocks, cb, entry);
|
||||||
control_free_block(cs, cb);
|
control_free_block(cs, cb);
|
||||||
|
@ -1779,7 +1779,9 @@ server_client_check_exit(struct client *c)
|
|||||||
struct client_file *cf;
|
struct client_file *cf;
|
||||||
const char *name = c->exit_session;
|
const char *name = c->exit_session;
|
||||||
|
|
||||||
if ((c->flags & CLIENT_EXITED) || (~c->flags & CLIENT_EXIT))
|
if (c->flags & (CLIENT_DEAD|CLIENT_EXITED))
|
||||||
|
return;
|
||||||
|
if (~c->flags & CLIENT_EXIT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (c->flags & CLIENT_CONTROL) {
|
if (c->flags & CLIENT_CONTROL) {
|
||||||
|
14
tmux.c
14
tmux.c
@ -240,6 +240,20 @@ setblocking(int fd, int state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t
|
||||||
|
get_timer(void)
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We want a timestamp in milliseconds suitable for time measurement,
|
||||||
|
* so prefer the monotonic clock.
|
||||||
|
*/
|
||||||
|
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
|
||||||
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
|
return ((ts.tv_sec * 1000ULL) + (ts.tv_nsec / 1000000ULL));
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
sig2name(int signo)
|
sig2name(int signo)
|
||||||
{
|
{
|
||||||
|
1
tmux.h
1
tmux.h
@ -1852,6 +1852,7 @@ extern int ptm_fd;
|
|||||||
extern const char *shell_command;
|
extern const char *shell_command;
|
||||||
int checkshell(const char *);
|
int checkshell(const char *);
|
||||||
void setblocking(int, int);
|
void setblocking(int, int);
|
||||||
|
uint64_t get_timer(void);
|
||||||
const char *sig2name(int);
|
const char *sig2name(int);
|
||||||
const char *find_cwd(void);
|
const char *find_cwd(void);
|
||||||
const char *find_home(void);
|
const char *find_home(void);
|
||||||
|
@ -637,8 +637,6 @@ tty_keys_next(struct tty *tty)
|
|||||||
struct mouse_event m = { 0 };
|
struct mouse_event m = { 0 };
|
||||||
struct key_event *event;
|
struct key_event *event;
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
|
|
||||||
/* Get key buffer. */
|
/* Get key buffer. */
|
||||||
buf = EVBUFFER_DATA(tty->in);
|
buf = EVBUFFER_DATA(tty->in);
|
||||||
len = EVBUFFER_LENGTH(tty->in);
|
len = EVBUFFER_LENGTH(tty->in);
|
||||||
|
@ -2934,15 +2934,6 @@ window_copy_search(struct window_mode_entry *wme, int direction, int regex)
|
|||||||
return (found);
|
return (found);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t
|
|
||||||
window_copy_get_time(void)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
return ((tv.tv_sec * 1000ULL) + (tv.tv_usec / 1000ULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp,
|
window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp,
|
||||||
int regex)
|
int regex)
|
||||||
@ -2985,11 +2976,11 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tstart = window_copy_get_time();
|
tstart = get_timer();
|
||||||
|
|
||||||
start = 0;
|
start = 0;
|
||||||
end = gd->hsize + gd->sy;
|
end = gd->hsize + gd->sy;
|
||||||
stop = window_copy_get_time() + WINDOW_COPY_SEARCH_ALL_TIMEOUT;
|
stop = get_timer() + WINDOW_COPY_SEARCH_ALL_TIMEOUT;
|
||||||
|
|
||||||
again:
|
again:
|
||||||
free(data->searchmark);
|
free(data->searchmark);
|
||||||
@ -3027,7 +3018,7 @@ again:
|
|||||||
px++;
|
px++;
|
||||||
}
|
}
|
||||||
|
|
||||||
t = window_copy_get_time();
|
t = get_timer();
|
||||||
if (t - tstart > WINDOW_COPY_SEARCH_TIMEOUT) {
|
if (t - tstart > WINDOW_COPY_SEARCH_TIMEOUT) {
|
||||||
data->timeout = 1;
|
data->timeout = 1;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user