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)
|
} while (0)
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
map_buffer (counter_t *counter)
|
map_buffer (counter_t *counter, GError **err)
|
||||||
{
|
{
|
||||||
int n_bytes = N_PAGES * get_page_size();
|
int n_bytes = N_PAGES * get_page_size();
|
||||||
void *address, *a;
|
void *address, *a;
|
||||||
@ -331,8 +331,9 @@ map_buffer (counter_t *counter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static counter_t *
|
static counter_t *
|
||||||
counter_new (Collector *collector,
|
counter_new (Collector *collector,
|
||||||
int cpu)
|
int cpu,
|
||||||
|
GError **err)
|
||||||
{
|
{
|
||||||
struct perf_counter_attr attr;
|
struct perf_counter_attr attr;
|
||||||
counter_t *counter;
|
counter_t *counter;
|
||||||
@ -370,20 +371,20 @@ counter_new (Collector *collector,
|
|||||||
|
|
||||||
if (fd < 0)
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
counter->collector = collector;
|
counter->collector = collector;
|
||||||
counter->fd = fd;
|
counter->fd = fd;
|
||||||
|
|
||||||
counter->mmap_page = map_buffer (counter);
|
counter->mmap_page = map_buffer (counter, err);
|
||||||
|
|
||||||
if (counter->mmap_page == MAP_FAILED)
|
if (counter->mmap_page == MAP_FAILED)
|
||||||
{
|
|
||||||
fail ("mmap");
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
counter->data = (uint8_t *)counter->mmap_page + get_page_size ();
|
counter->data = (uint8_t *)counter->mmap_page + get_page_size ();
|
||||||
counter->tail = 0;
|
counter->tail = 0;
|
||||||
@ -667,7 +668,7 @@ collector_start (Collector *collector,
|
|||||||
|
|
||||||
for (i = 0; i < n_cpus; ++i)
|
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);
|
collector->counters = g_list_append (collector->counters, counter);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,8 @@ GQuark collector_error_quark (void);
|
|||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
COLLECTOR_ERROR_CANT_OPEN_FILE
|
COLLECTOR_ERROR_CANT_OPEN_FILE,
|
||||||
|
COLLECTOR_ERROR_CANT_OPEN_COUNTER
|
||||||
} CollectorError;
|
} CollectorError;
|
||||||
|
|
||||||
/* callback is called whenever a new sample arrives */
|
/* callback is called whenever a new sample arrives */
|
||||||
|
|||||||
@ -763,13 +763,13 @@ lookup_kernel_symbol (gulong address)
|
|||||||
kernel_symbol_t *result;
|
kernel_symbol_t *result;
|
||||||
GArray *ksyms = get_kernel_symbols ();
|
GArray *ksyms = get_kernel_symbols ();
|
||||||
const char *sym;
|
const char *sym;
|
||||||
const char *s;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ksyms->len == 0)
|
if (ksyms->len == 0)
|
||||||
return NULL;
|
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;
|
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))
|
if (model && gtk_tree_model_get_iter_first (model, &iter))
|
||||||
process_iter (view, &iter, callback, data);
|
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,
|
void tree_view_foreach_visible (GtkTreeView *view,
|
||||||
VisibleCallback callback,
|
VisibleCallback callback,
|
||||||
gpointer data);
|
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