X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=runtime%2Flwt.c;h=42e79bff9ae89651447e05490e0dca5572af409a;hp=d7b9862d360284750df0a4d47518750958d1fc56;hb=9ec5405d406696c6cbdb7a47ade7fccc736a8b53;hpb=efd90a1b8a9d3bbb1bdd8e6ae41b3462e7193fb2 diff --git a/runtime/lwt.c b/runtime/lwt.c index d7b9862..42e79bf 100644 --- a/runtime/lwt.c +++ b/runtime/lwt.c @@ -11,6 +11,22 @@ #include "lwt.h" #include "mem.h" +#define LWT_BUFFER_SCALE 16 +#define LWT_BUFFER_SIZE (1 << LWT_BUFFER_SCALE) +#define LWT_BUFFER_MASK (LWT_BUFFER_SIZE - 1) + +typedef struct lwt_record { + uint64_t timestamp; + const char *format; + size_t value1; + size_t value2; +} lwt_record_t; + +typedef struct lwt_buffer { + uint32_t head; + lwt_record_t x[0]; +} lwt_buffer_t; + DECLARE_THREAD_LOCAL(tb_, int); lwt_buffer_t *lwt_buf_[MAX_NUM_THREADS] = {}; @@ -109,3 +125,14 @@ void lwt_dump (const char *file_name) fclose(file); } } + +void lwt_trace_i (const char *format, size_t value1, size_t value2) { + LOCALIZE_THREAD_LOCAL(tb_, lwt_buffer_t *); + if (tb_) { + unsigned int u, l; + __asm__ __volatile__("rdtsc" : "=a" (l), "=d" (u)); + uint64_t timestamp = ((uint64_t)u << 32) | l; + lwt_record_t temp = { timestamp, format, value1, value2 }; + tb_->x[tb_->head++ & LWT_BUFFER_MASK] = temp; + } +}