Пример #1
0
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;
}
Пример #2
0
/** 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;
}
Пример #3
0
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);
}