|
|
|
@ -151,19 +151,25 @@ static void worker_job_queue_cb(struct ev_loop *loop, ev_timer *w, int revents)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* cache timestamp */
|
|
|
|
|
GString *worker_current_timestamp(worker *wrk) {
|
|
|
|
|
time_t cur_ts = (time_t)CUR_TS(wrk);
|
|
|
|
|
if (cur_ts != wrk->last_generated_date_ts) {
|
|
|
|
|
g_string_set_size(wrk->ts_date_str, 255);
|
|
|
|
|
strftime(wrk->ts_date_str->str, wrk->ts_date_str->allocated_len,
|
|
|
|
|
"%a, %d %b %Y %H:%M:%S GMT", gmtime(&(cur_ts)));
|
|
|
|
|
GString *worker_current_timestamp(worker *wrk, guint format_ndx) {
|
|
|
|
|
gsize len;
|
|
|
|
|
worker_ts *wts = &g_array_index(wrk->timestamps, worker_ts, format_ndx);
|
|
|
|
|
ev_tstamp now = CUR_TS(wrk);
|
|
|
|
|
|
|
|
|
|
g_string_set_size(wrk->ts_date_str, strlen(wrk->ts_date_str->str));
|
|
|
|
|
/* cache hit */
|
|
|
|
|
if ((now - wts->last_generated) > 1.0)
|
|
|
|
|
return wts->str;
|
|
|
|
|
|
|
|
|
|
wrk->last_generated_date_ts = cur_ts;
|
|
|
|
|
}
|
|
|
|
|
return wrk->ts_date_str;
|
|
|
|
|
g_string_set_size(wts->str, 255);
|
|
|
|
|
len = strftime(wts->str->str, wts->str->allocated_len, g_array_index(wrk->srv->ts_formats, GString*, format_ndx)->str, gmtime((time_t*)(&wts->last_generated)));
|
|
|
|
|
if (len == 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
g_string_set_size(wts->str, len);
|
|
|
|
|
wts->last_generated = now;
|
|
|
|
|
return wts->str;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* stop worker watcher */
|
|
|
|
@ -280,8 +286,12 @@ worker* worker_new(struct server *srv, struct ev_loop *loop) {
|
|
|
|
|
|
|
|
|
|
wrk->tmp_str = g_string_sized_new(255);
|
|
|
|
|
|
|
|
|
|
wrk->last_generated_date_ts = 0;
|
|
|
|
|
wrk->ts_date_str = g_string_sized_new(255);
|
|
|
|
|
wrk->timestamps = g_array_sized_new(FALSE, TRUE, sizeof(worker_ts), srv->ts_formats->len);
|
|
|
|
|
{
|
|
|
|
|
guint i;
|
|
|
|
|
for (i = 0; i < srv->ts_formats->len; i++)
|
|
|
|
|
g_array_index(wrk->timestamps, worker_ts, i).str = g_string_sized_new(255);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ev_init(&wrk->worker_exit_watcher, worker_exit_cb);
|
|
|
|
|
wrk->worker_exit_watcher.data = wrk;
|
|
|
|
@ -353,8 +363,11 @@ void worker_free(worker *wrk) {
|
|
|
|
|
ev_ref(wrk->loop);
|
|
|
|
|
ev_async_stop(wrk->loop, &wrk->worker_exit_watcher);
|
|
|
|
|
|
|
|
|
|
g_string_free(wrk->tmp_str, TRUE);
|
|
|
|
|
g_string_free(wrk->ts_date_str, TRUE);
|
|
|
|
|
{ /* free timestamps */
|
|
|
|
|
guint i;
|
|
|
|
|
for (i = 0; i < wrk->timestamps->len; i++)
|
|
|
|
|
g_string_free(g_array_index(wrk->timestamps, worker_ts, i).str, TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_async_queue_unref(wrk->new_con_queue);
|
|
|
|
|
|
|
|
|
|