Return error when the counter can't be opened.

This commit is contained in:
Søren Sandmann Pedersen
2009-11-02 13:30:04 -05:00
parent 1b64f1d924
commit 71f2cd3a64
5 changed files with 51 additions and 12 deletions

View File

@ -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);
}

View File

@ -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 */

View File

@ -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;

View File

@ -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);
}

View File

@ -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);