On Thu, Oct 02, 2014 at 02:32:08PM +0400, Alexander Yarygin wrote:

SNIP

> +             if (!oe->buffer) {
> +                     if (oe->copy_on_queue) {
> +                             oe->cur_alloc_size -= new_event->header.size;
> +                             free(new_event);
> +                     }
>                       return NULL;
> +             }
>  
>               pr("alloc size %" PRIu64 "B (+%zu), max %" PRIu64 "B\n",
>                  oe->cur_alloc_size, size, oe->max_alloc_size);
> @@ -90,15 +110,19 @@ static struct ordered_event *alloc_event(struct 
> ordered_events *oe)
>               pr("allocation limit reached %" PRIu64 "B\n", 
> oe->max_alloc_size);
>       }
>  
> +     new->event = new_event;
> +
>       return new;
>  }
>  
>  struct ordered_event *
> -ordered_events__new(struct ordered_events *oe, u64 timestamp)
> +ordered_events__new(struct ordered_events *oe, u64 timestamp,
> +                 union perf_event *event)
>  {
>       struct ordered_event *new;
>  
> -     new = alloc_event(oe);
> +     new = alloc_event(oe, event);
> +
>       if (new) {
>               new->timestamp = timestamp;
>               queue_event(oe, new);
> @@ -111,6 +135,10 @@ void ordered_events__delete(struct ordered_events *oe, 
> struct ordered_event *eve
>  {
>       list_move(&event->list, &oe->cache);
>       oe->nr_events--;
> +     if (oe->copy_on_queue) {
> +             oe->cur_alloc_size -= event->event->header.size;
> +             free(event->event);
> +     }
>  }
>  
>  static int __ordered_events__flush(struct perf_session *s,
> @@ -240,6 +268,11 @@ void ordered_events__free(struct ordered_events *oe)
>  
>               event = list_entry(oe->to_free.next, struct ordered_event, 
> list);
>               list_del(&event->list);
> +             if (oe->copy_on_queue) {
> +                     oe->cur_alloc_size -= event->event->header.size;
> +                     free(event->event);
> +             }
> +
>               free(event);

looks ok.. but I was wondering if we could move those repeating
bits in function.. something like below (untested, just compiled)

thanks,
jirka


---
diff --git a/tools/perf/util/ordered-events.c b/tools/perf/util/ordered-events.c
index f7383ccc6690..583dcefc92fb 100644
--- a/tools/perf/util/ordered-events.c
+++ b/tools/perf/util/ordered-events.c
@@ -58,23 +58,41 @@ static void queue_event(struct ordered_events *oe, struct 
ordered_event *new)
        }
 }
 
+static union perf_event *__dup_event(struct ordered_events *oe, union 
perf_event *event)
+{
+       union perf_event *new_event = NULL;
+
+       if (oe->cur_alloc_size < oe->max_alloc_size) {
+               new_event = memdup(event, event->header.size);
+               if (new_event)
+                       oe->cur_alloc_size += event->header.size;
+       }
+
+       return new_event;
+}
+
+static union perf_event *dup_event(struct ordered_events *oe, union perf_event 
*event)
+{
+       return oe->copy_on_queue ? __dup_event(oe, event) : event;
+}
+
+static void free_dup_event(struct ordered_events *oe, union perf_event *event)
+{
+       if (oe->copy_on_queue) {
+               oe->cur_alloc_size -= event->header.size;
+               free(event);
+       }
+}
+
 #define MAX_SAMPLE_BUFFER      (64 * 1024 / sizeof(struct ordered_event))
 static struct ordered_event *alloc_event(struct ordered_events *oe,
                                         union perf_event *event)
 {
        struct list_head *cache = &oe->cache;
        struct ordered_event *new = NULL;
-       union perf_event *new_event = NULL;
-
-       if (oe->copy_on_queue) {
-               if (oe->cur_alloc_size < oe->max_alloc_size) {
-                       new_event = memdup(event, event->header.size);
-                       if (new_event)
-                               oe->cur_alloc_size += event->header.size;
-               }
-       } else
-               new_event = event;
+       union perf_event *new_event;
 
+       new_event = dup_event(oe, event);
        if (!new_event)
                return NULL;
 
@@ -90,10 +108,7 @@ static struct ordered_event *alloc_event(struct 
ordered_events *oe,
 
                oe->buffer = malloc(size);
                if (!oe->buffer) {
-                       if (oe->copy_on_queue) {
-                               oe->cur_alloc_size -= new_event->header.size;
-                               free(new_event);
-                       }
+                       free_dup_event(oe, new_event);
                        return NULL;
                }
 
@@ -135,10 +150,7 @@ void ordered_events__delete(struct ordered_events *oe, 
struct ordered_event *eve
 {
        list_move(&event->list, &oe->cache);
        oe->nr_events--;
-       if (oe->copy_on_queue) {
-               oe->cur_alloc_size -= event->event->header.size;
-               free(event->event);
-       }
+       free_dup_event(oe, event->event);
 }
 
 static int __ordered_events__flush(struct perf_session *s,
@@ -268,11 +280,7 @@ void ordered_events__free(struct ordered_events *oe)
 
                event = list_entry(oe->to_free.next, struct ordered_event, 
list);
                list_del(&event->list);
-               if (oe->copy_on_queue) {
-                       oe->cur_alloc_size -= event->event->header.size;
-                       free(event->event);
-               }
-
+               free_dup_event(oe, event->event);
                free(event);
        }
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to