mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
Return error when the counter can't be opened.
This commit is contained in:
19
collector.c
19
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);
|
||||
}
|
||||
|
||||
@ -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 */
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user