Allow profile results to be written to a file.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 30 Nov 2010 04:57:27 +0000 (20:57 -0800)
committerMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 30 Nov 2010 04:57:27 +0000 (20:57 -0800)
bluesky/bluesky.h
bluesky/util.c
nfs3/nfsd.c

index 653adc8..bf01abe 100644 (file)
@@ -10,6 +10,7 @@
 #define _BLUESKY_H
 
 #include <stdint.h>
+#include <stdio.h>
 #include <inttypes.h>
 #include <glib.h>
 
@@ -379,6 +380,7 @@ void bluesky_profile_add_event(BlueSkyProfile *profile, char *message);
 void bluesky_profile_print(BlueSkyProfile *profile);
 BlueSkyProfile *bluesky_profile_get();
 void bluesky_profile_set(BlueSkyProfile *profile);
+void bluesky_profile_set_output(FILE *stream);
 
 #ifdef __cplusplus
 }
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);
 }
 
index 6c975f2..e95ac7c 100644 (file)
@@ -57,6 +57,10 @@ int main(int argc, char *argv[])
     if (key == NULL)
         key = "";
 
+    const char *profile_output = getenv("BLUESKY_PROFILE_OUT");
+    if (profile_output != NULL)
+        bluesky_profile_set_output(fopen(profile_output, "a"));
+
     store = bluesky_store_new(target);
     fs = bluesky_init_fs("export", store, key);