diff --git a/daemon/call.c b/daemon/call.c index 701b26911..301f99dd8 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -199,7 +199,7 @@ static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_ if (pe->confirmed || !pe->filled || r->idx != 0) goto forward; - if (!c->lookup_done || poller_now(m->poller) <= c->lookup_done + 3) + if (!c->lookup_done || poller_now <= c->lookup_done + 3) goto peerinfo; mylog(LOG_DEBUG, LOG_PREFIX_C "Confirmed peer information for port %u - %s:%u", @@ -305,7 +305,7 @@ drop: r->stats.bytes += l; m->statsps.packets++; m->statsps.bytes += l; - r->last = poller_now(m->poller); + r->last = poller_now; return 0; } @@ -448,7 +448,6 @@ static void call_timer_iterator(void *key, void *val, void *ptr) { struct callstream *cs; int i, j; struct peer *p; - struct poller *po; struct callmaster *cm; unsigned int check; struct streamrelay *sr; @@ -457,7 +456,6 @@ static void call_timer_iterator(void *key, void *val, void *ptr) { goto drop; cm = c->callmaster; - po = cm->poller; for (it = c->callstreams->head; it; it = it->next) { cs = it->data; @@ -474,7 +472,7 @@ static void call_timer_iterator(void *key, void *val, void *ptr) { else if (IN6_IS_ADDR_UNSPECIFIED(&sr->peer.ip46)) check = cm->silent_timeout; - if (poller_now(po) - sr->last < check) + if (poller_now - sr->last < check) goto good; } } @@ -551,11 +549,9 @@ static void callmaster_timer(void *ptr) { struct call *c; struct mediaproxy_list_entry *ke; struct streamrelay *sr; - struct poller *po; u_int64_t d; ZERO(hlp); - po = m->poller; rwlock_lock_r(&m->lock); g_hash_table_foreach(m->callhash, call_timer_iterator, &hlp); @@ -577,7 +573,7 @@ static void callmaster_timer(void *ptr) { DS(errors); if (ke->stats.packets != sr->kstats.packets) - sr->last = poller_now(po); + sr->last = poller_now; sr->kstats.packets = ke->stats.packets; sr->kstats.bytes = ke->stats.bytes; @@ -926,7 +922,7 @@ void callstream_init(struct callstream *s, struct call *ca, int port1, int port2 r->fd = -1; r->idx = j; r->up = p; - r->last = poller_now(po); + r->last = poller_now; } tport = (i == 0) ? port1 : port2; @@ -1325,7 +1321,7 @@ static struct call *call_create(const char *callid, struct callmaster *m) { c->callmaster = m; c->callid = strdup(callid); c->callstreams = g_queue_new(); - c->created = poller_now(m->poller); + c->created = poller_now; c->infohash = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); c->branches = g_hash_table_new_full(g_str_hash0, g_str_equal0, free, NULL); return c; @@ -1668,7 +1664,7 @@ static void call_status_iterator(void *key, void *val, void *ptr) { (char *) g_hash_table_lookup(c->infohash, "from"), (char *) g_hash_table_lookup(c->infohash, "to"), c->calling_agent, c->called_agent, - (int) (poller_now(m->poller) - c->created)); + (int) (poller_now - c->created)); for (l = c->callstreams->head; l; l = l->next) { cs = l->data; @@ -1698,7 +1694,7 @@ static void call_status_iterator(void *key, void *val, void *ptr) { (long long unsigned int) r1->stats.bytes + rx1->stats.bytes + r2->stats.bytes + rx2->stats.bytes, "active", p->codec ? : "unknown", - p->mediatype, (int) (poller_now(m->poller) - r1->last)); + p->mediatype, (int) (poller_now - r1->last)); } } diff --git a/daemon/control.c b/daemon/control.c index 7558051e6..d6ca08fb4 100644 --- a/daemon/control.c +++ b/daemon/control.c @@ -132,11 +132,10 @@ static int control_stream_parse(struct control_stream *s, char *line) { static void control_stream_timer(int fd, void *p, uintptr_t u) { struct control_stream *s = p; - struct poller *o = s->poller; int i; mutex_lock(&s->lock); - i = (poller_now(o) - s->inbuf->active) >= 60 || (poller_now(o) - s->outbuf->active) >= 60; + i = (poller_now - s->inbuf->active) >= 60 || (poller_now - s->outbuf->active) >= 60; mutex_unlock(&s->lock); if (i) diff --git a/daemon/control_udp.c b/daemon/control_udp.c index 30c990df0..f493ff99a 100644 --- a/daemon/control_udp.c +++ b/daemon/control_udp.c @@ -93,7 +93,7 @@ static void control_udp_incoming(int fd, void *p, uintptr_t x) { pcre_get_substring_list(buf, ovec, ret, &out); mutex_lock(&u->lock); - if (poller_now(u->poller) - u->oven_time >= 30) { + if (poller_now - u->oven_time >= 30) { g_hash_table_remove_all(u->stale_cookies); #if GLIB_CHECK_VERSION(2,14,0) g_string_chunk_clear(u->stale_chunks); @@ -104,7 +104,7 @@ static void control_udp_incoming(int fd, void *p, uintptr_t x) { u->fresh_chunks = g_string_chunk_new(4 * 1024); #endif swap_ptrs(&u->stale_cookies, &u->fresh_cookies); - u->oven_time = poller_now(u->poller); /* baked new cookies! */ + u->oven_time = poller_now; /* baked new cookies! */ } restart: @@ -215,7 +215,7 @@ struct control_udp *control_udp_new(struct poller *p, struct in6_addr ip, u_int1 c->stale_cookies = g_hash_table_new(g_str_hash, g_str_equal); c->fresh_chunks = g_string_chunk_new(4 * 1024); c->stale_chunks = g_string_chunk_new(4 * 1024); - c->oven_time = poller_now(p); + c->oven_time = poller_now; mutex_init(&c->lock); cond_init(&c->cond); c->parse_re = pcre_compile( diff --git a/daemon/poller.c b/daemon/poller.c index 4a83c56d8..f1dfc3207 100644 --- a/daemon/poller.c +++ b/daemon/poller.c @@ -42,14 +42,16 @@ struct poller { mutex_t timers_add_del_lock; /* nested below timers_lock */ GSList *timers_add; GSList *timers_del; - - time_t now; }; +__thread time_t poller_now; + + + struct poller *poller_new(void) { @@ -57,7 +59,7 @@ struct poller *poller_new(void) { p = malloc(sizeof(*p)); memset(p, 0, sizeof(*p)); - p->now = time(NULL); + poller_now = time(NULL); p->fd = epoll_create1(0); if (p->fd == -1) abort(); @@ -300,9 +302,9 @@ int poller_poll(struct poller *p, int timeout) { if (!p->items || !p->items_size) goto out; - last = p->now; - p->now = time(NULL); - if (last != p->now) { + last = poller_now; + poller_now = time(NULL); + if (last != poller_now) { mutex_unlock(&p->lock); poller_timers_run(p); ret = p->items_size; @@ -480,8 +482,3 @@ int poller_del_timer(struct poller *p, void (*f)(void *), struct obj *o) { int poller_add_timer(struct poller *p, void (*f)(void *), struct obj *o) { return poller_timer_link(p, &p->timers_add, f, o); } - -/* XXX not thread safe */ -time_t poller_now(struct poller *p) { - return p->now; -} diff --git a/daemon/poller.h b/daemon/poller.h index 558656470..b04abf2f7 100644 --- a/daemon/poller.h +++ b/daemon/poller.h @@ -26,6 +26,10 @@ struct poller; +extern __thread time_t poller_now; + + + struct poller *poller_new(void); int poller_add_item(struct poller *, struct poller_item *); @@ -35,7 +39,6 @@ int poller_poll(struct poller *, int); void poller_blocked(struct poller *, int); int poller_isblocked(struct poller *, int); void poller_error(struct poller *, int); -time_t poller_now(struct poller *); int poller_add_timer(struct poller *, void (*)(void *), struct obj *); int poller_del_timer(struct poller *, void (*)(void *), struct obj *); diff --git a/daemon/streambuf.c b/daemon/streambuf.c index 57780aa23..51d0594f7 100644 --- a/daemon/streambuf.c +++ b/daemon/streambuf.c @@ -21,7 +21,7 @@ struct streambuf *streambuf_new(struct poller *p, int fd) { b->buf = g_string_new(""); b->fd = fd; b->poller = p; - b->active = poller_now(p); + b->active = poller_now; return b; } @@ -52,7 +52,7 @@ int streambuf_writeable(struct streambuf *b) { if (ret > 0) { g_string_erase(b->buf, 0, ret); - b->active = poller_now(b->poller); + b->active = poller_now; } if (ret != out) { @@ -80,7 +80,7 @@ int streambuf_readable(struct streambuf *b) { } g_string_append_len(b->buf, buf, ret); - b->active = poller_now(b->poller); + b->active = poller_now; } return 0; @@ -167,7 +167,7 @@ void streambuf_write(struct streambuf *b, const char *s, unsigned int len) { s += ret; len -= ret; - b->active = poller_now(b->poller); + b->active = poller_now; } if (b->buf->len > 5242880)