#include "tls.h"
#include "runtime.h"
#include "hazard.h"
+#include "lwt.h"
typedef struct pending {
void * ptr;
int dynamic_size;
int dynamic_count;
-} haz_local_t;
+} __attribute__ ((aligned(CACHE_LINE_SIZE))) haz_local_t;
static haz_local_t haz_local_[MAX_NUM_THREADS] = {};
static void sort_hazards (haz_t *hazards, int n) {
+ TRACE("H3", "sort_hazards: sorting hazard list %p of %p elements", hazards, n);
return;
}
static int search_hazards (void *p, haz_t *hazards, int n) {
+ TRACE("H4", "search_hazards: searching list %p for hazard %p", hazards, p);
for (int i = 0; i < n; ++i) {
- if (hazards[i] == p)
+ if (hazards[i] == p) {
+ TRACE("H2", "haz_search_hazards: found hazard %p", p, 0);
return TRUE;
+ }
}
return FALSE;
}
static void resize_pending (void) {
- LOCALIZE_THREAD_LOCAL(tid_, int);
- haz_local_t *l = haz_local_ + tid_;
+ TRACE("H2", "haz_resize_pending", 0, 0);
+ LOCALIZE_THREAD_LOCAL(ThreadId, int);
+ haz_local_t *l = haz_local_ + ThreadId;
pending_t *p = nbd_malloc(sizeof(pending_t) * l->pending_size * 2);
memcpy(p, l->pending, l->pending_size);
nbd_free(l->pending);
}
void haz_defer_free (void *d, free_t f) {
+ TRACE("H1", "haz_defer_free: %p (%p)", d, f);
assert(d);
assert(f);
- LOCALIZE_THREAD_LOCAL(tid_, int);
- haz_local_t *l = haz_local_ + tid_;
+ LOCALIZE_THREAD_LOCAL(ThreadId, int);
+ haz_local_t *l = haz_local_ + ThreadId;
while (l->pending_count == l->pending_size) {
if (l->pending_size == 0) {
l->pending_count = conflicts_count;
nbd_free(hazards);
}
- l->pending[ l->pending_count ].ptr = d;
+ assert(l->pending_size > l->pending_count);
+ l->pending[ l->pending_count ].ptr = d;
l->pending[ l->pending_count ].free_ = f;
l->pending_count++;
}
haz_t *haz_get_static (int i) {
+ TRACE("H1", "haz_get_static: %p", i, 0);
if (i >= STATIC_HAZ_PER_THREAD)
return NULL;
- LOCALIZE_THREAD_LOCAL(tid_, int);
- return &haz_local_[tid_].static_haz[i];
+ LOCALIZE_THREAD_LOCAL(ThreadId, int);
+ assert(i < STATIC_HAZ_PER_THREAD);
+ haz_t *ret = &haz_local_[ThreadId].static_haz[i];
+ TRACE("H1", "haz_get_static: returning %p", ret, 0);
+ return ret;
}
void haz_register_dynamic (haz_t *haz) {
- LOCALIZE_THREAD_LOCAL(tid_, int);
- haz_local_t *l = haz_local_ + tid_;
+ TRACE("H1", "haz_register_dynamic: %p", haz, 0);
+ LOCALIZE_THREAD_LOCAL(ThreadId, int);
+ haz_local_t *l = haz_local_ + ThreadId;
if (l->dynamic_size == 0) {
- l->dynamic_size = MAX_NUM_THREADS * STATIC_HAZ_PER_THREAD;
- l->dynamic = nbd_malloc(sizeof(haz_t *) * l->dynamic_size);
+ int n = MAX_NUM_THREADS * STATIC_HAZ_PER_THREAD;
+ l->dynamic = nbd_malloc(sizeof(haz_t *) * n);
+ l->dynamic_size = n;
}
if (l->dynamic_count == l->dynamic_size) {
// assumes <haz> was registered in the same thread
void haz_unregister_dynamic (void **haz) {
- LOCALIZE_THREAD_LOCAL(tid_, int);
- haz_local_t *l = haz_local_ + tid_;
+ TRACE("H1", "haz_unregister_dynamic: %p", haz, 0);
+ LOCALIZE_THREAD_LOCAL(ThreadId, int);
+ haz_local_t *l = haz_local_ + ThreadId;
for (int i = 0; i < l->dynamic_count; ++i) {
if (l->dynamic[i] == haz) {
if (i != l->dynamic_count - 1) {
- l->dynamic[i] = l->dynamic[ l->dynamic_count ];
+ l->dynamic[i] = l->dynamic[ l->dynamic_count - 1 ];
}
l->dynamic_count--;
return;