From 2742af12a1a8cd99302f60521efe47cfbf16e963 Mon Sep 17 00:00:00 2001 From: Andre Date: Sun, 28 May 2006 21:53:57 +0200 Subject: [PATCH 1/1] audiod: get rid of all calls to gettimeofday(). Use a global variable instead that gets updated from within audio_pre_select() and audiod_post_select(). --- audiod.c | 53 ++++++++++++++++++++--------------------------------- 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/audiod.c b/audiod.c index 631bcf5e..bd7bb5b1 100644 --- a/audiod.c +++ b/audiod.c @@ -18,7 +18,6 @@ /** \file audiod.c the paraslash's audio daemon */ -#include /* gettimeofday */ #include "para.h" #include "audiod.cmdline.h" @@ -111,8 +110,8 @@ static char *af_status, /* the audio format announced in server status */ static char *stat_item_values[NUM_STAT_ITEMS]; static FILE *logfile; static const struct timeval restart_delay = {0, 300 * 1000}; - static struct audio_format_info afi[NUM_AUDIO_FORMATS]; +static struct timeval *now; static struct signal_task signal_task_struct, *sig_task = &signal_task_struct; @@ -315,7 +314,7 @@ static int client_write(int fd, const char *buf) static char *get_time_string(struct timeval *newest_stime) { - struct timeval now, diff, adj_stream_start, tmp; + struct timeval diff, adj_stream_start, tmp; int total = 0, use_server_time = 1; if (!playing) { @@ -339,8 +338,7 @@ static char *get_time_string(struct timeval *newest_stime) use_server_time = 0; } } - gettimeofday(&now, NULL); - tv_diff(&now, &tmp, &diff); + tv_diff(now, &tmp, &diff); total = diff.tv_sec + offset_seconds; if (total > length_seconds) total = length_seconds; @@ -466,17 +464,6 @@ static void clear_slot(int slot_num) s->format = -1; } -static void set_restart_barrier(int format, struct timeval *now) -{ - struct timeval tmp; - - if (now) - tmp = *now; - else - gettimeofday(&tmp, NULL); - tv_add(&tmp, &restart_delay, &afi[format].restart_barrier); -} - static void close_receiver(int slot_num) { struct slot_info *s = &slot[slot_num]; @@ -492,7 +479,8 @@ static void close_receiver(int slot_num) a->receiver->close(s->receiver_node); free(s->receiver_node); s->receiver_node = NULL; - set_restart_barrier(s->format, NULL); + /* set restart barrier */ + tv_add(now, &restart_delay, &afi[s->format].restart_barrier); } static void kill_all_decoders(void) @@ -509,8 +497,6 @@ static void kill_all_decoders(void) static void check_sigchld(void) { pid_t pid; - struct timeval now; - gettimeofday(&now, NULL); reap_next_child: pid = para_reap_child(); @@ -689,7 +675,7 @@ static void wng_event_handler(struct task *t) } } -static void open_writer(int slot_num, struct timeval *now) +static void open_writer(int slot_num) { int ret, i; struct slot_info *s = &slot[slot_num]; @@ -728,6 +714,7 @@ void rn_event_handler(struct task *t) PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret)); unregister_task(t); } + static void open_receiver(int format) { struct audio_format_info *a = &afi[format]; @@ -740,7 +727,7 @@ static void open_receiver(int format) clean_exit(EXIT_FAILURE, PARA_STRERROR(-slot_num)); s = &slot[slot_num]; s->format = format; - gettimeofday(&s->rtime, NULL); + s->rtime = *now; s->wtime = s->rtime; s->receiver_node = para_calloc(sizeof(struct receiver_node)); rn = s->receiver_node; @@ -766,14 +753,14 @@ static void open_receiver(int format) register_task(&rn->task); } -static int is_frozen(int format, struct timeval *now) +static int is_frozen(int format) { struct audio_format_info *a = &afi[format]; return (tv_diff(now, &a->restart_barrier, NULL) > 0)? 0 : 1; } -static void open_current_receiver(struct timeval *now) +static void open_current_receiver(void) { int i; @@ -782,21 +769,20 @@ static void open_current_receiver(struct timeval *now) i = get_audio_format_num(af_status); if (i < 0) return; - if ((decoder_running(i) & 1) || is_frozen(i, now)) + if (decoder_running(i) || is_frozen(i)) return; open_receiver(i); } static void compute_time_diff(const struct timeval *status_time) { - struct timeval now, tmp, diff; + struct timeval tmp, diff; static int count; int sign; const struct timeval max_deviation = {0, 500 * 1000}; const int time_smooth = 5; - gettimeofday(&now, NULL); - sign = tv_diff(status_time, &now, &diff); + sign = tv_diff(status_time, now, &diff); // PARA_NOTICE_LOG("%s: sign = %i, sa_time_diff_sign = %i\n", __func__, // sign, sa_time_diff_sign); if (!count) { @@ -891,17 +877,16 @@ static void handle_signal(int sig) static void check_timeouts(void) { - struct timeval now; + int slot_num, timeout = conf.stream_timeout_arg; - gettimeofday(&now, NULL); FOR_EACH_SLOT(slot_num) { struct slot_info *s = &slot[slot_num]; if (s->format < 0) continue; /* check read time */ if (s->receiver_node && - now.tv_sec > s->rtime.tv_sec + timeout) { + now->tv_sec > s->rtime.tv_sec + timeout) { PARA_INFO_LOG("%s stream (slot %d) not ready\n", audio_formats[s->format], slot_num); s->receiver_node->eof = 1; @@ -931,10 +916,11 @@ static void audiod_pre_select(struct sched *s, __a_unused struct task *t) { int i; + now = &s->now; if (audiod_status != AUDIOD_ON) kill_all_decoders(); else if (playing) - open_current_receiver(&s->now); + open_current_receiver(); check_timeouts(); FOR_EACH_SLOT(i) { struct receiver_node *rn; @@ -945,7 +931,7 @@ static void audiod_pre_select(struct sched *s, __a_unused struct task *t) rn = slot[i].receiver_node; if (rn && rn->loaded && !slot[i].wng) { open_filters(i); - open_writer(i, &s->now); + open_writer(i); } } } @@ -954,11 +940,12 @@ static void audiod_post_select(struct sched *s, __a_unused struct task *t) { int i; + now = &s->now; FOR_EACH_SLOT(i) { struct receiver_node *rn = slot[i].receiver_node; if (rn && rn->loaded) - slot[i].rtime = s->now; + slot[i].rtime = *now; } } -- 2.30.2