From e97499b2a468e4c854ce5af2c9ed1af1aaa2c023 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sun, 20 Nov 2016 16:59:20 -0800 Subject: [PATCH] capture-writer: use frame initializer function --- lib/sp-capture-writer.c | 263 ++++++++++++++++++---------------------- 1 file changed, 118 insertions(+), 145 deletions(-) diff --git a/lib/sp-capture-writer.c b/lib/sp-capture-writer.c index 15dcfbb0..b81f1e24 100644 --- a/lib/sp-capture-writer.c +++ b/lib/sp-capture-writer.c @@ -101,6 +101,24 @@ G_DEFINE_BOXED_TYPE (SpCaptureWriter, sp_capture_writer, sp_capture_writer_ref, sp_capture_writer_unref) #endif +static inline void +sp_capture_writer_frame_init (SpCaptureFrame *frame_, + gint len, + gint cpu, + GPid pid, + gint64 time_, + SpCaptureFrameType type) +{ + g_assert (frame_ != NULL); + + frame_->len = len; + frame_->cpu = cpu; + frame_->pid = pid; + frame_->time = time_; + frame_->type = type; + frame_->padding = 0; +} + static void sp_capture_writer_finalize (SpCaptureWriter *self) { @@ -191,6 +209,30 @@ sp_capture_writer_ensure_space_for (SpCaptureWriter *self, return TRUE; } +static inline gpointer +sp_capture_writer_allocate (SpCaptureWriter *self, + gsize *len) +{ + gpointer p; + + g_assert (self != NULL); + g_assert (len != NULL); + g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); + + sp_capture_writer_realign (len); + + if (!sp_capture_writer_ensure_space_for (self, *len)) + return NULL; + + p = (gpointer)&self->buf[self->pos]; + + self->pos += *len; + + g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); + + return p; +} + static gboolean sp_capture_writer_flush_jitmap (SpCaptureWriter *self) { @@ -209,11 +251,12 @@ sp_capture_writer_flush_jitmap (SpCaptureWriter *self) sp_capture_writer_realign (&len); - jitmap.frame.len = len; - jitmap.frame.cpu = -1; - jitmap.frame.pid = getpid (); - jitmap.frame.time = SP_CAPTURE_CURRENT_TIME; - jitmap.frame.type = SP_CAPTURE_FRAME_JITMAP; + sp_capture_writer_frame_init (&jitmap.frame, + len, + -1, + getpid (), + SP_CAPTURE_CURRENT_TIME, + SP_CAPTURE_FRAME_JITMAP); jitmap.n_jitmaps = self->addr_hash_size; if (sizeof jitmap != write (self->fd, &jitmap, sizeof jitmap)) @@ -368,6 +411,7 @@ sp_capture_writer_new_from_fd (int fd, SpCaptureWriter *self; SpCaptureFileHeader *header; GTimeVal tv; + gsize header_len = sizeof(*header); if (buffer_size == 0) buffer_size = DEFAULT_BUFFER_SIZE; @@ -388,7 +432,10 @@ sp_capture_writer_new_from_fd (int fd, g_get_current_time (&tv); nowstr = g_time_val_to_iso8601 (&tv); - header = (SpCaptureFileHeader *)(gpointer)self->buf; + header = sp_capture_writer_allocate (self, &header_len); + if (!header) + return NULL; + header->magic = SP_CAPTURE_MAGIC; header->version = 1; #ifdef G_LITTLE_ENDIAN @@ -402,8 +449,6 @@ sp_capture_writer_new_from_fd (int fd, header->end_time = 0; memset (header->suffix, 0, sizeof header->suffix); - self->pos += sizeof *header; - if (!sp_capture_writer_flush_data (self)) { sp_capture_writer_finalize (self); @@ -460,25 +505,20 @@ sp_capture_writer_add_map (SpCaptureWriter *self, filename = ""; g_assert (self != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); g_assert (filename != NULL); len = sizeof *ev + strlen (filename) + 1; - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + ev = (SpCaptureMap *)sp_capture_writer_allocate (self, &len); + if (!ev) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - ev = (SpCaptureMap *)(gpointer)&self->buf[self->pos]; - ev->frame.len = len; - ev->frame.cpu = cpu; - ev->frame.pid = pid; - ev->frame.time = time; - ev->frame.type = SP_CAPTURE_FRAME_MAP; - ev->frame.padding = 0; + sp_capture_writer_frame_init (&ev->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_MAP); ev->start = start; ev->end = end; ev->offset = offset; @@ -487,10 +527,6 @@ sp_capture_writer_add_map (SpCaptureWriter *self, g_strlcpy (ev->filename, filename, len - sizeof *ev); ev->filename[len - sizeof *ev - 1] = '\0'; - self->pos += ev->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - self->stat.frame_count[SP_CAPTURE_FRAME_MAP]++; return TRUE; @@ -528,33 +564,24 @@ sp_capture_writer_add_process (SpCaptureWriter *self, cmdline = ""; g_assert (self != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); g_assert (cmdline != NULL); len = sizeof *ev + strlen (cmdline) + 1; - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + ev = (SpCaptureProcess *)sp_capture_writer_allocate (self, &len); + if (!ev) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - ev = (SpCaptureProcess *)(gpointer)&self->buf[self->pos]; - ev->frame.len = len; - ev->frame.cpu = cpu; - ev->frame.pid = pid; - ev->frame.time = time; - ev->frame.type = SP_CAPTURE_FRAME_PROCESS; - ev->frame.padding = 0; + sp_capture_writer_frame_init (&ev->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_PROCESS); g_strlcpy (ev->cmdline, cmdline, len - sizeof *ev); ev->cmdline[len - sizeof *ev - 1] = '\0'; - self->pos += ev->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - self->stat.frame_count[SP_CAPTURE_FRAME_PROCESS]++; return TRUE; @@ -572,32 +599,23 @@ sp_capture_writer_add_sample (SpCaptureWriter *self, gsize len; g_assert (self != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); len = sizeof *ev + (n_addrs * sizeof (SpCaptureAddress)); - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + ev = (SpCaptureSample *)sp_capture_writer_allocate (self, &len); + if (!ev) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - ev = (SpCaptureSample *)(gpointer)&self->buf[self->pos]; - ev->frame.len = len; - ev->frame.cpu = cpu; - ev->frame.pid = pid; - ev->frame.time = time; - ev->frame.type = SP_CAPTURE_FRAME_SAMPLE; - ev->frame.padding = 0; + sp_capture_writer_frame_init (&ev->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_SAMPLE); ev->n_addrs = n_addrs; memcpy (ev->addrs, addrs, (n_addrs * sizeof (SpCaptureAddress))); - self->pos += ev->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - self->stat.frame_count[SP_CAPTURE_FRAME_SAMPLE]++; return TRUE; @@ -614,28 +632,19 @@ sp_capture_writer_add_fork (SpCaptureWriter *self, gsize len = sizeof *ev; g_assert (self != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + ev = (SpCaptureFork *)sp_capture_writer_allocate (self, &len); + if (!ev) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - ev = (SpCaptureFork *)(gpointer)&self->buf[self->pos]; - ev->frame.len = len; - ev->frame.cpu = cpu; - ev->frame.pid = pid; - ev->frame.time = time; - ev->frame.type = SP_CAPTURE_FRAME_FORK; - ev->frame.padding = 0; + sp_capture_writer_frame_init (&ev->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_FORK); ev->child_pid = child_pid; - self->pos += ev->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - self->stat.frame_count[SP_CAPTURE_FRAME_FORK]++; return TRUE; @@ -651,26 +660,17 @@ sp_capture_writer_add_exit (SpCaptureWriter *self, gsize len = sizeof *ev; g_assert (self != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + ev = (SpCaptureExit *)sp_capture_writer_allocate (self, &len); + if (!ev) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - ev = (SpCaptureExit *)(gpointer)&self->buf[self->pos]; - ev->frame.len = len; - ev->frame.cpu = cpu; - ev->frame.pid = pid; - ev->frame.time = time; - ev->frame.type = SP_CAPTURE_FRAME_EXIT; - ev->frame.padding = 0; - - self->pos += ev->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); + sp_capture_writer_frame_init (&ev->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_EXIT); self->stat.frame_count[SP_CAPTURE_FRAME_EXIT]++; @@ -687,28 +687,19 @@ sp_capture_writer_add_timestamp (SpCaptureWriter *self, gsize len = sizeof *ev; g_assert (self != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + ev = (SpCaptureTimestamp *)sp_capture_writer_allocate (self, &len); + if (!ev) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); + sp_capture_writer_frame_init (&ev->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_TIMESTAMP); - ev = (SpCaptureTimestamp *)(gpointer)&self->buf[self->pos]; - ev->frame.len = len; - ev->frame.cpu = cpu; - ev->frame.pid = pid; - ev->frame.time = time; - ev->frame.type = SP_CAPTURE_FRAME_TIMESTAMP; - ev->frame.padding = 0; - - self->pos += ev->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - self->stat.frame_count[SP_CAPTURE_FRAME_TIMESTAMP]++; + self->stat.frame_count[SP_CAPTURE_FRAME_TIMESTAMP]++; return TRUE; } @@ -1020,37 +1011,28 @@ sp_capture_writer_define_counters (SpCaptureWriter *self, g_assert (self != NULL); g_assert (counters != NULL); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); if (n_counters == 0) return TRUE; len = sizeof *def + (sizeof *counters * n_counters); - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + def = (SpCaptureFrameCounterDefine *)sp_capture_writer_allocate (self, &len); + if (!def) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - def = (SpCaptureFrameCounterDefine *)&self->buf[self->pos]; - def->frame.len = len; - def->frame.cpu = cpu; - def->frame.pid = pid; - def->frame.time = time; - def->frame.type = SP_CAPTURE_FRAME_CTRDEF; - def->frame.padding = 0; + sp_capture_writer_frame_init (&def->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_CTRDEF); def->padding = 0; def->n_counters = n_counters; for (i = 0; i < n_counters; i++) def->counters[i] = counters[i]; - self->pos += def->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - self->stat.frame_count[SP_CAPTURE_FRAME_CTRDEF]++; return TRUE; @@ -1075,7 +1057,6 @@ sp_capture_writer_set_counters (SpCaptureWriter *self, g_assert (self != NULL); g_assert (counters_ids != NULL); g_assert (values != NULL || !n_counters); - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); if (n_counters == 0) return TRUE; @@ -1087,20 +1068,16 @@ sp_capture_writer_set_counters (SpCaptureWriter *self, len = sizeof *set + (n_groups * sizeof (SpCaptureCounterValues)); - sp_capture_writer_realign (&len); - - if (!sp_capture_writer_ensure_space_for (self, len)) + set = (SpCaptureFrameCounterSet *)sp_capture_writer_allocate (self, &len); + if (!set) return FALSE; - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - - set = (SpCaptureFrameCounterSet *)&self->buf[self->pos]; - set->frame.len = len; - set->frame.cpu = cpu; - set->frame.pid = pid; - set->frame.time = time; - set->frame.type = SP_CAPTURE_FRAME_CTRSET; - set->frame.padding = 0; + sp_capture_writer_frame_init (&set->frame, + len, + cpu, + pid, + time, + SP_CAPTURE_FRAME_CTRSET); set->padding = 0; set->n_values = n_groups; @@ -1118,10 +1095,6 @@ sp_capture_writer_set_counters (SpCaptureWriter *self, } } - self->pos += set->frame.len; - - g_assert ((self->pos % SP_CAPTURE_ALIGN) == 0); - self->stat.frame_count[SP_CAPTURE_FRAME_CTRSET]++; return TRUE;