diff --git a/collector.c b/collector.c index 4b75f2d0..2b7937c7 100644 --- a/collector.c +++ b/collector.c @@ -295,7 +295,7 @@ on_read (gpointer data) } while (0) static void * -map_buffer (counter_t *counter) +map_buffer (counter_t *counter, GError **err) { int n_bytes = N_PAGES * get_page_size(); void *address, *a; @@ -331,8 +331,9 @@ map_buffer (counter_t *counter) } static counter_t * -counter_new (Collector *collector, - int cpu) +counter_new (Collector *collector, + int cpu, + GError **err) { struct perf_counter_attr attr; counter_t *counter; @@ -370,20 +371,20 @@ counter_new (Collector *collector, if (fd < 0) { - fail ("perf_counter_open"); + g_set_error (err, COLLECTOR_ERROR, COLLECTOR_ERROR_CANT_OPEN_COUNTER, + "Could not open performance counter: %s\n", + strerror (errno)); + return NULL; } counter->collector = collector; counter->fd = fd; - counter->mmap_page = map_buffer (counter); + counter->mmap_page = map_buffer (counter, err); if (counter->mmap_page == MAP_FAILED) - { - fail ("mmap"); return NULL; - } counter->data = (uint8_t *)counter->mmap_page + get_page_size (); counter->tail = 0; @@ -667,7 +668,7 @@ collector_start (Collector *collector, for (i = 0; i < n_cpus; ++i) { - counter_t *counter = counter_new (collector, i); + counter_t *counter = counter_new (collector, i, err); collector->counters = g_list_append (collector->counters, counter); } diff --git a/collector.h b/collector.h index 3f9420df..1caa145a 100644 --- a/collector.h +++ b/collector.h @@ -30,7 +30,8 @@ GQuark collector_error_quark (void); typedef enum { - COLLECTOR_ERROR_CANT_OPEN_FILE + COLLECTOR_ERROR_CANT_OPEN_FILE, + COLLECTOR_ERROR_CANT_OPEN_COUNTER } CollectorError; /* callback is called whenever a new sample arrives */ diff --git a/tracker.c b/tracker.c index 7b0dc9e2..b20c8f00 100644 --- a/tracker.c +++ b/tracker.c @@ -763,13 +763,13 @@ lookup_kernel_symbol (gulong address) kernel_symbol_t *result; GArray *ksyms = get_kernel_symbols (); const char *sym; - const char *s; int i; if (ksyms->len == 0) return NULL; - result = do_lookup ((kernel_symbol_t *)ksyms->data, address, 0, ksyms->len - 1); + result = do_lookup ((kernel_symbol_t *)ksyms->data, + address, 0, ksyms->len - 1); sym = result? result->name : NULL; diff --git a/treeviewutils.c b/treeviewutils.c index 7511daf3..20d7777f 100644 --- a/treeviewutils.c +++ b/treeviewutils.c @@ -329,3 +329,34 @@ tree_view_foreach_visible (GtkTreeView *view, if (model && gtk_tree_model_get_iter_first (model, &iter)) process_iter (view, &iter, callback, data); } + +/* Not really a *treeview* utility, but there isn't really a + * better place to put it + */ +void +set_error (GError **err, gint domain, gint code, + const char *format, va_list args) +{ + char *msg; + + if (!err) + return; + + msg = g_strdup_vprintf (format, args); + + if (*err == NULL) + { + *err = g_error_new_literal (G_MARKUP_ERROR, code, msg); + } + else + { + /* Warning text from GLib */ + g_warning ("GError set over the top of a previous GError or uninitialized memory.\n" + "This indicates a bug in someone's code. You must ensure an error is NULL before it's set.\n" + "The overwriting error message was: %s", + msg); + } + + g_free (msg); +} + diff --git a/treeviewutils.h b/treeviewutils.h index 9dca0dbc..a6eb1e5e 100644 --- a/treeviewutils.h +++ b/treeviewutils.h @@ -47,3 +47,9 @@ typedef void (* VisibleCallback) (GtkTreeView *view, void tree_view_foreach_visible (GtkTreeView *view, VisibleCallback callback, gpointer data); + + + +void +set_error_va (GError **err, gint domain, gint code, + const char *format, va_list args);