AtlatestRepositorysigil-wm
1
/* SPDX-License-Identifier: BSD-3-Clause */2
#include <assert.h>3
#include <stdbool.h>4
#include <stdint.h>5
#include <stdatomic.h>6
#include <stdio.h>7
#include <time.h>8
#include "../src/c/trace-records.h"9
int main(void) {10
struct trace_record record;11
struct trace_output output={0};12
/* An invalid clock pointer is never read in the disabled path. */13
assert(!trace_record_at(1,1,1,1,(const struct timespec *)(uintptr_t)1));14
trace_output_damage(&output,1);15
assert(!output.count && !trace.write && !atomic_load(&trace.dropped));16
atomic_store(&trace.enabled,true);17
for(unsigned i=0;i<12000;i++) {18
assert(trace_record_at(1,i,0,0,NULL));19
assert(trace_next(&record) && record.correlation==i && record.ns>0);20
}21
for(unsigned i=0;i<TRACE_RECORDS+20;i++) trace_record_at(1,i,0,0,NULL);22
assert(atomic_load(&trace.dropped)==20 && atomic_load(&trace.enabled));23
while(trace_next(&record)) {}24
assert(trace_record_at(1,12001,0,0,NULL));25
assert(trace_next(&record) && record.correlation==12001);26
trace_output_damage(&output,101);27
trace_output_commit(&output,10,7,NULL);28
trace_output_damage(&output,202);29
trace_output_damage(&output,303);30
trace_output_commit(&output,11,7,NULL);31
/* Present the older action after a newer submission and commit. */32
trace_output_present(&output,10,7,true,NULL);33
trace_output_present(&output,11,7,true,NULL);34
uint64_t expected[]={101,202,303,101,202,303};35
for(unsigned i=0;i<6;i++) {36
assert(trace_next(&record));37
assert(record.correlation==expected[i]);38
assert(record.stage==(i<3 ? 8u : 9u));39
assert(record.sequence==((i==0 || i==3) ? 10u : 11u));40
}41
assert(!trace_next(&record));42
atomic_flag_test_and_set(&trace.busy);43
assert(!trace_record_at(1,0,0,0,NULL));44
assert(atomic_load(&trace.dropped)==21);45
atomic_flag_clear(&trace.busy);46
puts("TRACE_RECORDS=PASS disabled overlap 12000 overflow recovery contention");47
}