diff options
Diffstat (limited to 'tools/perf/util/mmap.c')
-rw-r--r-- | tools/perf/util/mmap.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c index 4f59eaefc706..f804926778b7 100644 --- a/tools/perf/util/mmap.c +++ b/tools/perf/util/mmap.c | |||
@@ -113,6 +113,45 @@ union perf_event *perf_mmap__read_backward(struct perf_mmap *map) | |||
113 | return perf_mmap__read(map, &map->prev, end); | 113 | return perf_mmap__read(map, &map->prev, end); |
114 | } | 114 | } |
115 | 115 | ||
116 | /* | ||
117 | * Read event from ring buffer one by one. | ||
118 | * Return one event for each call. | ||
119 | * | ||
120 | * Usage: | ||
121 | * perf_mmap__read_init() | ||
122 | * while(event = perf_mmap__read_event()) { | ||
123 | * //process the event | ||
124 | * perf_mmap__consume() | ||
125 | * } | ||
126 | * perf_mmap__read_done() | ||
127 | */ | ||
128 | union perf_event *perf_mmap__read_event(struct perf_mmap *map, | ||
129 | bool overwrite, | ||
130 | u64 *startp, u64 end) | ||
131 | { | ||
132 | union perf_event *event; | ||
133 | |||
134 | /* | ||
135 | * Check if event was unmapped due to a POLLHUP/POLLERR. | ||
136 | */ | ||
137 | if (!refcount_read(&map->refcnt)) | ||
138 | return NULL; | ||
139 | |||
140 | if (startp == NULL) | ||
141 | return NULL; | ||
142 | |||
143 | /* non-overwirte doesn't pause the ringbuffer */ | ||
144 | if (!overwrite) | ||
145 | end = perf_mmap__read_head(map); | ||
146 | |||
147 | event = perf_mmap__read(map, startp, end); | ||
148 | |||
149 | if (!overwrite) | ||
150 | map->prev = *startp; | ||
151 | |||
152 | return event; | ||
153 | } | ||
154 | |||
116 | void perf_mmap__read_catchup(struct perf_mmap *map) | 155 | void perf_mmap__read_catchup(struct perf_mmap *map) |
117 | { | 156 | { |
118 | u64 head; | 157 | u64 head; |