Emit flush events in order, after the user event
Fixes the backwards jump in time warnings each 2 MB of buffer, caused by the flush events being written out of order.
This commit is contained in:
parent
e05f78bb0f
commit
29ea26e871
56
ovni.c
56
ovni.c
@ -498,10 +498,28 @@ ovni_flush(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
add_flush_events(uint64_t t0, uint64_t t1)
|
||||
{
|
||||
struct ovni_ev pre={0}, post={0};
|
||||
|
||||
pre.header.clock = t0;
|
||||
ovni_ev_set_mcv(&pre, "OF[");
|
||||
|
||||
post.header.clock = t1;
|
||||
ovni_ev_set_mcv(&post, "OF]");
|
||||
|
||||
/* Add the two flush events */
|
||||
ovni_ev_add(&pre);
|
||||
ovni_ev_add(&post);
|
||||
}
|
||||
|
||||
static void
|
||||
ovni_ev_add_jumbo(struct ovni_ev *ev, uint8_t *buf, uint32_t bufsize)
|
||||
{
|
||||
size_t evsize, totalsize;
|
||||
int flushed = 0;
|
||||
uint64_t t0, t1;
|
||||
|
||||
assert(ovni_payload_size(ev) == 0);
|
||||
|
||||
@ -512,7 +530,13 @@ ovni_ev_add_jumbo(struct ovni_ev *ev, uint8_t *buf, uint32_t bufsize)
|
||||
|
||||
/* Check if the event fits or flush first otherwise */
|
||||
if(rthread.evlen + totalsize >= OVNI_MAX_EV_BUF)
|
||||
ovni_flush();
|
||||
{
|
||||
/* Measure the flush times */
|
||||
t0 = ovni_get_clock();
|
||||
flush_evbuf();
|
||||
t1 = ovni_get_clock();
|
||||
flushed = 1;
|
||||
}
|
||||
|
||||
/* Se the jumbo flag here, so we capture the previous evsize
|
||||
* properly, ignoring the jumbo buffer */
|
||||
@ -524,22 +548,46 @@ ovni_ev_add_jumbo(struct ovni_ev *ev, uint8_t *buf, uint32_t bufsize)
|
||||
rthread.evlen += bufsize;
|
||||
|
||||
assert(rthread.evlen < OVNI_MAX_EV_BUF);
|
||||
}
|
||||
|
||||
if(flushed)
|
||||
{
|
||||
/* Emit the flush events *after* the user event */
|
||||
add_flush_events(t0, t1);
|
||||
|
||||
/* Set the current clock to the last event */
|
||||
rthread.clockvalue = t1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ovni_ev_add(struct ovni_ev *ev)
|
||||
{
|
||||
int size;
|
||||
int size, flushed = 0;
|
||||
uint64_t t0, t1;
|
||||
|
||||
size = ovni_ev_size(ev);
|
||||
|
||||
/* Check if the event fits or flush first otherwise */
|
||||
if(rthread.evlen + size >= OVNI_MAX_EV_BUF)
|
||||
ovni_flush();
|
||||
{
|
||||
/* Measure the flush times */
|
||||
t0 = ovni_get_clock();
|
||||
flush_evbuf();
|
||||
t1 = ovni_get_clock();
|
||||
flushed = 1;
|
||||
}
|
||||
|
||||
memcpy(&rthread.evbuf[rthread.evlen], ev, size);
|
||||
rthread.evlen += size;
|
||||
|
||||
if(flushed)
|
||||
{
|
||||
/* Emit the flush events *after* the user event */
|
||||
add_flush_events(t0, t1);
|
||||
|
||||
/* Set the current clock to the last event */
|
||||
rthread.clockvalue = t1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user