AtlatestRepositorysigil-wm

sigil-wm / tree / testtrace-records.c

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"
9int 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");