From 946ed972734f5c95f67e30aff99a58de0179b2d5 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 4 Nov 2009 23:42:51 +0000 Subject: [PATCH] Move status timer check into the global once-per-second timer, this could maybe be done better but one every second is better than once every 50 ms. --- server-client.c | 80 ++++++++++++++++++++++++------------------------- server.c | 2 ++ tmux.h | 1 + 3 files changed, 43 insertions(+), 40 deletions(-) diff --git a/server-client.c b/server-client.c index ec243300..f44dc02c 100644 --- a/server-client.c +++ b/server-client.c @@ -30,7 +30,6 @@ void server_client_handle_data(struct client *); void server_client_check_redraw(struct client *); void server_client_set_title(struct client *); -void server_client_check_timers(struct client *); int server_client_msg_dispatch(struct client *); void server_client_msg_command(struct client *, struct msg_command_data *); @@ -184,6 +183,45 @@ client_lost: server_client_lost(c); } +/* Handle client status timer. */ +void +server_client_status_timer(void) +{ + struct client *c; + struct session *s; + struct job *job; + struct timeval tv; + u_int i, interval; + + if (gettimeofday(&tv, NULL) != 0) + fatal("gettimeofday failed"); + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (c->message_string != NULL || c->prompt_string != NULL) { + /* + * Don't need timed redraw for messages/prompts so bail + * now. The status timer isn't reset when they are + * redrawn anyway. + */ + continue; + } + s = c->session; + + if (!options_get_number(&s->options, "status")) + continue; + interval = options_get_number(&s->options, "status-interval"); + + if (tv.tv_sec - c->status_timer.tv_sec >= interval) { + RB_FOREACH(job, jobs, &c->status_jobs) + job_run(job); + c->flags |= CLIENT_STATUS; + } + } +} + /* Client functions that need to happen every loop. */ void server_client_loop(void) @@ -199,10 +237,8 @@ server_client_loop(void) continue; server_client_handle_data(c); - if (c->session != NULL) { - server_client_check_timers(c); + if (c->session != NULL) server_client_check_redraw(c); - } } /* @@ -439,42 +475,6 @@ server_client_set_title(struct client *c) xfree(title); } -/* Check client timers. */ -void -server_client_check_timers(struct client *c) -{ - struct session *s = c->session; - struct job *job; - struct timeval tv; - u_int interval; - - if (gettimeofday(&tv, NULL) != 0) - fatal("gettimeofday failed"); - - if (c->message_string != NULL || c->prompt_string != NULL) { - /* - * Don't need timed redraw for messages/prompts so bail now. - * The status timer isn't reset when they are redrawn anyway. - */ - return; - - } - if (!options_get_number(&s->options, "status")) - return; - - /* Check timer; resolution is only a second so don't be too clever. */ - interval = options_get_number(&s->options, "status-interval"); - if (interval == 0) - return; - if (tv.tv_sec < c->status_timer.tv_sec || - ((u_int) tv.tv_sec) - c->status_timer.tv_sec >= interval) { - /* Run the jobs for this client and schedule for redraw. */ - RB_FOREACH(job, jobs, &c->status_jobs) - job_run(job); - c->flags |= CLIENT_STATUS; - } -} - /* Dispatch message from client. */ int server_client_msg_dispatch(struct client *c) diff --git a/server.c b/server.c index 4c1f9cea..a34d9b02 100644 --- a/server.c +++ b/server.c @@ -520,6 +520,8 @@ server_second_callback(unused int fd, unused short events, unused void *arg) } } + server_client_status_timer(); + evtimer_del(&server_ev_second); memset(&tv, 0, sizeof tv); tv.tv_sec = 1; diff --git a/tmux.h b/tmux.h index d33cb634..2839dd29 100644 --- a/tmux.h +++ b/tmux.h @@ -1565,6 +1565,7 @@ void server_signal_clear(void); void server_client_create(int); void server_client_lost(struct client *); void server_client_callback(int, short, void *); +void server_client_status_timer(void); void server_client_loop(void); /* server-window.c */