v2 / vlib / v / trace_calls / tracing_calls.c.v
58 lines · 54 sloc · 1.25 KB · 7d57a19d7e4924b0da97185fefb4191e677d2639
Raw
1@[has_globals]
2module trace_calls
3
4@[markused]
5__global g_stack_base = &u8(unsafe { nil })
6__global g_start_time = u64(0)
7
8@[markused]
9pub fn on_call(fname string) {
10 mut volatile pfbase := &u8(unsafe { nil })
11 volatile fbase := u8(0)
12 ns := current_time() - g_start_time
13 mut ssize := u64(0)
14 mut tid := u32(0)
15 unsafe {
16 $if windows {
17 tid = C.GetCurrentThreadId()
18 } $else $if linux {
19 tid = C.gettid()
20 } $else {
21 tid = u32(C.pthread_self())
22 }
23 pfbase = &fbase
24 ssize = u64(g_stack_base) - u64(pfbase)
25 }
26 $if x64 {
27 C.fprintf(C.stderr, c'> trace %8d %8ld %8ld %s\n', tid, ns, ssize, fname.str)
28 } $else {
29 C.fprintf(C.stderr, c'> trace %8d %8lld %8lld %s\n', tid, ns, ssize, fname.str)
30 }
31 C.fflush(C.stderr)
32}
33
34@[inline]
35fn current_time() u64 {
36 unsafe {
37 $if windows {
38 tm := u64(0)
39 C.QueryPerformanceCounter(&tm)
40 return tm
41 } $else {
42 ts := C.timespec{}
43 C.clock_gettime(C.CLOCK_MONOTONIC, &ts)
44 return u64(ts.tv_sec) * 1000000000 + u64(ts.tv_nsec)
45 }
46 }
47}
48
49@[markused]
50pub fn on_c_main(should_trace_c_main bool) {
51 g_start_time = current_time()
52 // > trace 2128896 714640 28148 fn
53 C.fprintf(C.stderr, c'# tid ns ssize name\n')
54 C.fflush(C.stderr)
55 if should_trace_c_main {
56 on_call('C.main')
57 }
58}
59