aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/mmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/mmap.c')
-rw-r--r--tools/perf/util/mmap.c39
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 */
128union 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
116void perf_mmap__read_catchup(struct perf_mmap *map) 155void perf_mmap__read_catchup(struct perf_mmap *map)
117{ 156{
118 u64 head; 157 u64 head;