int block_get_off_bynid(struct block *b, uint64_t nid, struct block_pair **bpair) { uint32_t i; int rval = NESS_ERR; rwlock_read_lock(&b->rwlock, &b->mtx); for (i = 0; i < b->pairs_used; i++) { if (b->pairs[i].nid == nid) { if (b->pairs[i].used) { *bpair = &b->pairs[i]; rval = NESS_OK; break; } } } rwlock_read_unlock(&b->rwlock); return rval; }
/** Open a handle to a semaphore. * @param id ID of the semaphore to open. * @param rights Access rights for the handle. * @param handlep Where to store handle to semaphore. * @return Status code describing result of the operation. */ status_t kern_semaphore_open(semaphore_id_t id, object_rights_t rights, handle_t *handlep) { user_semaphore_t *sem; status_t ret; if(!handlep) return STATUS_INVALID_ARG; rwlock_read_lock(&semaphore_tree_lock); sem = avl_tree_lookup(&semaphore_tree, id); if(!sem) { rwlock_unlock(&semaphore_tree_lock); return STATUS_NOT_FOUND; } refcount_inc(&sem->count); rwlock_unlock(&semaphore_tree_lock); ret = object_handle_open(&sem->obj, NULL, rights, NULL, 0, NULL, NULL, handlep); if(ret != STATUS_SUCCESS) user_semaphore_release(sem); return ret; }
int main(void) { uint64_t s_b, e_b, i; ck_bytelock_t bytelock = CK_BYTELOCK_INITIALIZER; rwlock_t naive; for (i = 0; i < STEPS; i++) { ck_bytelock_write_lock(&bytelock, 1); ck_bytelock_write_unlock(&bytelock); } s_b = rdtsc(); for (i = 0; i < STEPS; i++) { ck_bytelock_write_lock(&bytelock, 1); ck_bytelock_write_unlock(&bytelock); } e_b = rdtsc(); printf("WRITE: bytelock %15" PRIu64 "\n", (e_b - s_b) / STEPS); rwlock_init(&naive); for (i = 0; i < STEPS; i++) { rwlock_write_lock(&naive); rwlock_write_unlock(&naive); } s_b = rdtsc(); for (i = 0; i < STEPS; i++) { rwlock_write_lock(&naive); rwlock_write_unlock(&naive); } e_b = rdtsc(); printf("WRITE: naive %15" PRIu64 "\n", (e_b - s_b) / STEPS); for (i = 0; i < STEPS; i++) { ck_bytelock_read_lock(&bytelock, 1); ck_bytelock_read_unlock(&bytelock, 1); } s_b = rdtsc(); for (i = 0; i < STEPS; i++) { ck_bytelock_read_lock(&bytelock, 1); ck_bytelock_read_unlock(&bytelock, 1); } e_b = rdtsc(); printf("READ: bytelock %15" PRIu64 "\n", (e_b - s_b) / STEPS); for (i = 0; i < STEPS; i++) { rwlock_read_lock(&naive); rwlock_read_unlock(&naive); } s_b = rdtsc(); for (i = 0; i < STEPS; i++) { rwlock_read_lock(&naive); rwlock_read_unlock(&naive); } e_b = rdtsc(); printf("READ: naive %15" PRIu64 "\n", (e_b - s_b) / STEPS); return (0); }