Start to add request time profiling.
[bluesky.git] / bluesky / util.c
index c5618b9..90eda70 100644 (file)
@@ -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);
+}