X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=runtime%2Flwt.c;h=8f12974247136e4cd7327967cf917b2b43518417;hp=42e79bff9ae89651447e05490e0dca5572af409a;hb=fb536c12185fd1e339b5fd479d9ef84554b436df;hpb=3ad1b21110cea1cf04f6acf5500d774bba05a8c8 diff --git a/runtime/lwt.c b/runtime/lwt.c index 42e79bf..8f12974 100644 --- a/runtime/lwt.c +++ b/runtime/lwt.c @@ -5,9 +5,8 @@ * lightweight tracing */ #include - #include "common.h" -#include "tls.h" +#include "runtime_local.h" #include "lwt.h" #include "mem.h" @@ -27,26 +26,16 @@ typedef struct lwt_buffer { lwt_record_t x[0]; } lwt_buffer_t; -DECLARE_THREAD_LOCAL(tb_, int); - lwt_buffer_t *lwt_buf_[MAX_NUM_THREADS] = {}; uint64_t flag_mask_ = 0; -static int buf_count_ = 0; static const char *flags_ = ""; -void lwt_init (void) -{ - INIT_THREAD_LOCAL(tb_, NULL); -} - void lwt_thread_init (int thread_id) { assert(thread_id < MAX_NUM_THREADS); if (lwt_buf_[thread_id] == NULL) { lwt_buf_[thread_id] = (lwt_buffer_t *)nbd_malloc(sizeof(lwt_buffer_t) + sizeof(lwt_record_t) * LWT_BUFFER_SIZE); - SYNC_ADD(&buf_count_, 1); memset(lwt_buf_[thread_id], 0, sizeof(lwt_buffer_t)); - SET_THREAD_LOCAL(tb_, lwt_buf_[thread_id]); } } @@ -77,17 +66,15 @@ static inline void dump_record (FILE *file, int thread_id, lwt_record_t *r, uint static void dump_buffer (FILE *file, int thread_id, uint64_t offset) { - assert(thread_id < buf_count_); - lwt_buffer_t *tb = lwt_buf_[thread_id]; - int i; + assert(tb); if (tb->head > LWT_BUFFER_SIZE) { - for (i = tb->head & LWT_BUFFER_MASK; i < LWT_BUFFER_SIZE; ++i) { + for (int i = tb->head & LWT_BUFFER_MASK; i < LWT_BUFFER_SIZE; ++i) { dump_record(file, thread_id, tb->x + i, offset); } } - for (i = 0; i < (tb->head & LWT_BUFFER_MASK); ++i) { + for (int i = 0; i < (tb->head & LWT_BUFFER_MASK); ++i) { dump_record(file, thread_id, tb->x + i, offset); } } @@ -95,9 +82,8 @@ static void dump_buffer (FILE *file, int thread_id, uint64_t offset) void lwt_dump (const char *file_name) { uint64_t offset = (uint64_t)-1; - int i; - for (i = 0; i < buf_count_; ++i) { + for (int i = 0; i < MAX_NUM_THREADS; ++i) { if (lwt_buf_[i] != NULL && lwt_buf_[i]->head != 0) { uint64_t x = lwt_buf_[i]->x[0].timestamp; if (x < offset) { @@ -116,7 +102,7 @@ void lwt_dump (const char *file_name) if (offset != (uint64_t)-1) { FILE *file = fopen(file_name, "w"); assert(file); - for (i = 0; i < buf_count_; ++i) { + for (int i = 0; i < MAX_NUM_THREADS; ++i) { if (lwt_buf_[i] != NULL) { dump_buffer(file, i, offset); } @@ -127,12 +113,14 @@ void lwt_dump (const char *file_name) } void lwt_trace_i (const char *format, size_t value1, size_t value2) { - LOCALIZE_THREAD_LOCAL(tb_, lwt_buffer_t *); - if (tb_) { + LOCALIZE_THREAD_LOCAL(tid_, int); + lwt_buffer_t *tb = lwt_buf_[tid_]; + if (tb != NULL) { 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; + + tb->x[tb->head++ & LWT_BUFFER_MASK] = temp; } }