- 论坛徽章:
- 4
|
20可用积分
本帖最后由 chishanmingshen 于 2013-02-28 00:09 编辑
from 3.7.0
- static struct ring_buffer_event *
- rb_buffer_peek(struct ring_buffer_per_cpu *cpu_buffer, u64 *ts,
- unsigned long *lost_events)
- {
- struct ring_buffer_event *event;
- struct buffer_page *reader;
- int nr_loops = 0;
- again:
- /*
- * We repeat when a time extend is encountered.
- * Since the time extend is always attached to a data event,
- * we should never loop more than once.
- * (We never hit the following condition more than twice).
- */
- if (RB_WARN_ON(cpu_buffer, ++nr_loops > 2))<------------------此处是2,老的版本是3!
- return NULL;
- reader = rb_get_reader_page(cpu_buffer);
- if (!reader)
- return NULL;
- event = rb_reader_event(cpu_buffer);
- switch (event->type_len) {
- case RINGBUF_TYPE_PADDING:
- if (rb_null_event(event))
- RB_WARN_ON(cpu_buffer, 1);
- /*
- * Because the writer could be discarding every
- * event it creates (which would probably be bad)
- * if we were to go back to "again" then we may never
- * catch up, and will trigger the warn on, or lock
- * the box. Return the padding, and we will release
- * the current locks, and try again.
- */
- return event;
- case RINGBUF_TYPE_TIME_EXTEND:
- /* Internal data, OK to advance */
- rb_advance_reader(cpu_buffer);
- goto again;
- case RINGBUF_TYPE_TIME_STAMP:
- /* FIXME: not implemented */
- rb_advance_reader(cpu_buffer);
- goto again;
- case RINGBUF_TYPE_DATA:
- if (ts) {
- *ts = cpu_buffer->read_stamp + event->time_delta;
- ring_buffer_normalize_time_stamp(cpu_buffer->buffer,
- cpu_buffer->cpu, ts);
- }
- if (lost_events)
- *lost_events = rb_lost_events(cpu_buffer);
- return event;
- default:
- BUG();
- }
- return NULL;
- }
复制代码 版本之间有些差异,奇怪。。。 |
|