Browse Source

using thread-local-storage for eliminating constant calls to time()

git.mgm/mediaproxy-ng/2.1
Richard Fuchs 14 years ago
parent
commit
db15692f21
6 changed files with 28 additions and 33 deletions
  1. +8
    -12
      daemon/call.c
  2. +1
    -2
      daemon/control.c
  3. +3
    -3
      daemon/control_udp.c
  4. +8
    -11
      daemon/poller.c
  5. +4
    -1
      daemon/poller.h
  6. +4
    -4
      daemon/streambuf.c

+ 8
- 12
daemon/call.c View File

@ -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));
}
}


+ 1
- 2
daemon/control.c View File

@ -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)


+ 3
- 3
daemon/control_udp.c View File

@ -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(


+ 8
- 11
daemon/poller.c View File

@ -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;
}

+ 4
- 1
daemon/poller.h View File

@ -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 *);


+ 4
- 4
daemon/streambuf.c View File

@ -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)


Loading…
Cancel
Save