X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Futil.c;h=90eda70d5f3caef3518d3c1715fa0e654ec0fb0a;hb=5dccfe81a6b4521383acf0b675374493950d09db;hp=c5618b9125d4f81d84f852c3328668047d47793e;hpb=24d7c56795e253e6b6052b8d5c512bbda6c92b7f;p=bluesky.git diff --git a/bluesky/util.c b/bluesky/util.c index c5618b9..90eda70 100644 --- a/bluesky/util.c +++ b/bluesky/util.c @@ -336,3 +336,65 @@ void bluesky_rangeset_get_extents(BlueSkyRangeset *rangeset, item = (BlueSkyRangesetItem *)g_sequence_get(i); *length = (item->start + item->length) - *start; } + +/**** Request response-time tracking. ****/ +/* TODO: Locking */ +typedef struct { + bluesky_time_hires timestamp; + char *message; +} RTEvent; + +BlueSkyProfile *bluesky_profile_new() +{ + return g_new0(BlueSkyProfile, 1); +} + +void bluesky_profile_free(BlueSkyProfile *profile) +{ + while (profile->events != NULL) { + RTEvent *event = (RTEvent *)profile->events->data; + g_free(event->message); + g_free(event); + profile->events = g_list_delete_link(profile->events, profile->events); + } + g_free(profile->description); + g_free(profile); +} + +void bluesky_profile_add_event(BlueSkyProfile *profile, char *message) +{ + g_return_if_fail(profile != NULL); + + RTEvent *event = g_new(RTEvent, 1); + event->timestamp = bluesky_now_hires(); + event->message = message; + profile->events = g_list_prepend(profile->events, event); +} + +void bluesky_profile_print(BlueSkyProfile *profile) +{ + g_return_if_fail(profile != NULL); + + g_print("Event Timeline: %s\n", profile->description); + GList *link = g_list_last(profile->events); + bluesky_time_hires last_time = 0; + while (link != NULL) { + RTEvent *event = (RTEvent *)link->data; + g_print(" [%"PRIi64" ns]: %s\n", + event->timestamp - last_time, event->message); + last_time = event->timestamp; + link = link->prev; + } +} + +static GStaticPrivate per_thread_profile = G_STATIC_PRIVATE_INIT; + +BlueSkyProfile *bluesky_profile_get() +{ + return (BlueSkyProfile *)g_static_private_get(&per_thread_profile); +} + +void bluesky_profile_set(BlueSkyProfile *profile) +{ + g_static_private_set(&per_thread_profile, profile, NULL); +}