X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdebug.c;fp=bluesky%2Fdebug.c;h=bea83223c3eb36861f17860d753f46e716e8e3b2;hb=e282bc08ad6c2a69a38af6a9179947af70ac0b17;hp=7de509559bb573dee5bdddb3d86850862d6833aa;hpb=a073843b1f414bf939031abf1b6fdbc5261f1820;p=bluesky.git diff --git a/bluesky/debug.c b/bluesky/debug.c index 7de5095..bea8322 100644 --- a/bluesky/debug.c +++ b/bluesky/debug.c @@ -166,3 +166,48 @@ void bluesky_stats_dump_all() } g_static_mutex_unlock(&stats_lock); } + +static void periodic_stats_dumper(FILE *f) +{ + const int64_t interval = 10 * 1000000000ULL; + bluesky_time_hires timestamp = bluesky_now_hires(); + bluesky_time_hires next_timestamp = timestamp; + + while (TRUE) { + g_static_mutex_lock(&stats_lock); + timestamp = bluesky_now_hires(); + fprintf(f, "********\ntime=%f\n\n", timestamp / 1e9); + for (GList *item = stats_list; item != NULL; item = item->next) { + struct bluesky_stats *stats = (struct bluesky_stats *)item->data; + fprintf(f, "%s: count=%"PRIi64" sum=%"PRIi64"\n", + stats->name, stats->count, stats->sum); + } + g_static_mutex_unlock(&stats_lock); + fflush(f); + + /* Wait until ten seconds from the last timestamp, with a few extra + * checks for sanity (always try to wait some amount of time in the + * range [0, 20] seconds). */ + timestamp = bluesky_now_hires(); + next_timestamp += interval; + if (next_timestamp < timestamp) { + next_timestamp = timestamp; + continue; + } + if (next_timestamp - timestamp > 2 * interval) { + next_timestamp = timestamp + interval; + } + + struct timespec delay; + delay.tv_sec = (next_timestamp - timestamp) / 1000000000; + delay.tv_nsec = (next_timestamp - timestamp) % 1000000000; + nanosleep(&delay, NULL); + } +} + +/* Start a background thread that will periodically dump statistics counters to + * he specified file every ten seconds. */ +void bluesky_stats_run_periodic_dump(FILE *f) +{ + g_thread_create((GThreadFunc)periodic_stats_dumper, f, FALSE, NULL); +}