//The following operations are assumed to be local error_t remote_fifo_init(struct remote_fifo_s *remote_fifo, size_t slot_nbr, size_t size) { kmem_req_t req; size_t slot_size; slot_size = size; req.type = KMEM_GENERIC; req.flags = AF_KERNEL | AF_ZERO; req.size = slot_size * slot_nbr; remote_fifo->tbl = kmem_alloc(&req); if(remote_fifo->tbl == NULL) return ENOMEM; remote_fifo->wridx = 0; remote_fifo->rdidx = 0; remote_fifo->slot_nbr = slot_nbr; remote_fifo->slot_size = slot_size; remote_fifo->item_size = size; mcs_lock_init(&remote_fifo->lock, "Remote fifo"); return 0; }
int bthread_barrier_init(bthread_barrier_t* b, const bthread_barrierattr_t* a, int count) { struct mcs_lock_qnode local_qn = {0}; memset(b->local_sense,0,sizeof(b->local_sense)); b->sense = 0; b->nprocs = b->count = count; mcs_lock_init(&b->lock); return 0; }
/* TODO: put lock name as argument * and reconstruct each wait_queue name */ error_t rwlock_init(struct rwlock_s *rwlock) { //spinlock_init(&rwlock->lock,"RWLOCK"); mcs_lock_init(&rwlock->lock, "RWLOCK"); rwlock->signature = RWLOCK_ID; rwlock->count = 0; wait_queue_init(&rwlock->rd_wait_queue, "RWLOCK: Rreaders"); wait_queue_init(&rwlock->wr_wait_queue, "RWLOCK: Writers"); return 0; }
void init_arc(struct arsc_channel* ac) { // Set up the front ring for the general syscall ring // and the back ring for the general sysevent ring mcs_lock_init(&ac->aclock); ac->ring_page = (syscall_sring_t*)sys_init_arsc(); FRONT_RING_INIT(&ac->sysfr, ac->ring_page, SYSCALLRINGSIZE); //BACK_RING_INIT(&syseventbackring, &(__procdata.syseventring), SYSEVENTRINGSIZE); //TODO: eventually rethink about desc pools, they are here but no longer necessary POOL_INIT(&syscall_desc_pool, MAX_SYSCALLS); POOL_INIT(&async_desc_pool, MAX_ASYNCCALLS); }