#include "perf_counter.h"
#include "barrier.h"
+#define d_print(...)
+
#define N_PAGES 32 /* Number of pages in the ringbuffer */
typedef struct counter_t counter_t;
if (head < tail)
{
- g_warning ("sysprof fails at ring buffers\n");
+ g_warning ("sysprof fails at ring buffers (head %llu, tail %llu\n", head, tail);
tail = head;
}
static void
counter_disable (counter_t *counter)
{
+ d_print ("disable\n");
+
ioctl (counter->fd, PERF_COUNTER_IOC_DISABLE);
}
static void
counter_free (counter_t *counter)
{
+ d_print ("munmap\n");
+
munmap (counter->mmap_page, (N_PAGES + 1) * get_page_size());
fd_remove_watch (counter->fd);
{
GList *list;
+ d_print ("enable\n");
+
for (list = collector->counters; list != NULL; list = list->next)
{
counter_t *counter = list->data;
{
GList *list;
+ d_print ("disable\n");
+
for (list = collector->counters; list != NULL; list = list->next)
{
counter_t *counter = list->data;
*/
if (collector->counters)
{
- g_print ("disable counters\n");
+ d_print ("disable counters\n");
disable_counters (collector);
}
if (collector->counters)
{
- g_print ("enable counters\n");
+ d_print ("enable counters\n");
enable_counters (collector);
}
static void
process_comm (Collector *collector, comm_event_t *comm)
{
- g_print ("pid, tid: %d %d", comm->pid, comm->tid);
+ d_print ("pid, tid: %d %d", comm->pid, comm->tid);
tracker_add_process (collector->tracker,
comm->pid,
static void
process_fork (Collector *collector, fork_event_t *fork)
{
- g_print ("ppid: %d pid: %d ptid: %d tid %d",
+ d_print ("ppid: %d pid: %d ptid: %d tid %d",
fork->ppid, fork->pid, fork->ptid, fork->tid);
tracker_add_fork (collector->tracker, fork->ppid, fork->pid);
static void
process_exit (Collector *collector, exit_event_t *exit)
{
- g_print ("for %d %d", exit->pid, exit->tid);
+ d_print ("for %d %d", exit->pid, exit->tid);
tracker_add_exit (collector->tracker, exit->pid);
}
uint64_t *ips;
int n_ips;
- g_print ("pid, tid: %d %d", sample->pid, sample->tid);
+ d_print ("pid, tid: %d %d", sample->pid, sample->tid);
if (sample->n_ips == 0)
{
default: name = "unknown"; break;
}
- g_print ("cpu %d :: %s :: ", counter->cpu, name);
+ d_print ("cpu %d :: %s :: ", counter->cpu, name);
switch (event->header.type)
{
break;
}
- g_print ("\n");
+ d_print ("\n");
}
gboolean
{
GList *list;
+ if (!collector->counters)
+ return;
+
+ /* Read any remaining data */
for (list = collector->counters; list != NULL; list = list->next)
{
counter_t *counter = list->data;
+ on_read (counter);
+
counter_free (counter);
}
Profile *
collector_create_profile (Collector *collector)
{
+ /* The collector must be stopped when you create a profile */
+ g_assert (!collector->counters);
+
return tracker_create_profile (collector->tracker);
}