Allow profile results to be written to a file.
[bluesky.git] / bluesky / util.c
index 99e341f..45bc9f5 100644 (file)
@@ -383,21 +383,32 @@ void bluesky_profile_add_event(BlueSkyProfile *profile, char *message)
     g_mutex_unlock(profile->lock);
 }
 
+static FILE *profiling_file = NULL;
+static GStaticMutex profiling_print_lock = G_STATIC_MUTEX_INIT;
+
+void bluesky_profile_set_output(FILE *stream)
+{
+    profiling_file = stream;
+}
+
 void bluesky_profile_print(BlueSkyProfile *profile)
 {
+    FILE *stream = profiling_file ? profiling_file : stdout;
     g_return_if_fail(profile != NULL);
 
     g_mutex_lock(profile->lock);
-    g_print("Event Timeline: %s\n", profile->description);
+    g_static_mutex_lock(&profiling_print_lock);
+    fprintf(stream, "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("  [%d] [%"PRIi64" ns]: %s\n",
+        fprintf(stream, "  [%d] [%"PRIi64" ns]: %s\n",
                 event->tid, event->timestamp - last_time, event->message);
         last_time = event->timestamp;
         link = link->prev;
     }
+    g_static_mutex_unlock(&profiling_print_lock);
     g_mutex_unlock(profile->lock);
 }