*/
#include <stdio.h>
#include "common.h"
-#include "runtime_local.h"
+#include "rlocal.h"
#include "lwt.h"
#include "mem.h"
-#define LWT_BUFFER_SCALE 16
+#define LWT_BUFFER_SCALE 20
#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;
+ uint64_t format;
size_t value1;
size_t value2;
} lwt_record_t;
} lwt_buffer_t;
lwt_buffer_t *lwt_buf_[MAX_NUM_THREADS] = {};
-uint64_t flag_mask_ = 0;
+char flag_state_[256] = {};
static const char *flags_ = "";
void lwt_thread_init (int thread_id)
{
assert(strlen(flags) % 2 == 0); // a well formed <flags> should be an even number of characters long
flags_ = flags;
- int i;
- for (i = 0; flags[i]; i+=2) {
- flag_mask_ |= 1 << (flags[i] - 'A');
+ memset(flag_state_, 0, sizeof(flag_state_));
+ for (int i = 0; flags[i]; i+=2) {
+ flag_state_[(unsigned)flags[i]] = flags[i+1];
}
}
-static inline void dump_record (FILE *file, int thread_id, lwt_record_t *r, uint64_t offset)
+static void dump_record (FILE *file, int thread_id, lwt_record_t *r, uint64_t offset)
{
// print the record if its trace category is enabled at a high enough level
- int flag = (size_t)r->format >> 56;
- int level = ((size_t)r->format >> 48) & 0xFF;
- const char *f = strchr(flags_, flag);
- if (f != NULL && level <= f[1]) {
+ int flag = r->format >> 56;
+ int level = (r->format >> 48) & 0xFF;
+ if (flag_state_[(unsigned)flag] >= level) {
char s[3] = {flag, level, '\0'};
- fprintf(file, "%09llu %d %s ", ((uint64_t)r->timestamp - offset) >> 6, thread_id, s);
- const char *format = (const char *)((size_t)r->format & MASK(48)); // strip out the embedded flags
+ fprintf(file, "%09llu %d %s ", ((uint64_t)r->timestamp - offset) >> 5, thread_id, s);
+ const char *format = (const char *)(size_t)(r->format & MASK(48)); // strip out the embedded flags
fprintf(file, format, r->value1, r->value2);
fprintf(file, "\n");
}
}
}
+void lwt_halt (void) {
+ halt_ = 1;
+}
+
void lwt_dump (const char *file_name)
{
halt_ = 1;
}
}
-void lwt_trace_i (const char *format, size_t value1, size_t value2) {
- if (*(volatile int *)&halt_)
- return;
+void lwt_trace_i (uint64_t format, size_t value1, size_t value2) {
+ while (halt_) {}
LOCALIZE_THREAD_LOCAL(tid_, int);
lwt_buffer_t *tb = lwt_buf_[tid_];
if (tb != NULL) {