s32 LWP_CreateThread(lwp_t *thethread,void* (*entry)(void *),void *arg,void *stackbase,u32 stack_size,u8 prio) { u32 status; lwp_cntrl *lwp_thread; if(!thethread || !entry) return -1; lwp_thread = __lwp_cntrl_allocate(); if(!lwp_thread) return -1; status = __lwp_thread_init(lwp_thread,stackbase,stack_size,__lwp_priotocore(prio),0,TRUE); if(!status) { __lwp_cntrl_free(lwp_thread); __lwp_thread_dispatchenable(); return -1; } status = __lwp_thread_start(lwp_thread,entry,arg); if(!status) { __lwp_cntrl_free(lwp_thread); __lwp_thread_dispatchenable(); return -1; } *thethread = (lwp_t)(LWP_OBJMASKTYPE(LWP_OBJTYPE_THREAD)|LWP_OBJMASKID(lwp_thread->object.id)); __lwp_thread_dispatchenable(); return 0; }
lwp_t LWP_GetSelf() { lwp_t ret; __lwp_thread_dispatchdisable(); ret = (lwp_t)(LWP_OBJMASKTYPE(LWP_OBJTYPE_THREAD)|LWP_OBJMASKID(_thr_executing->object.id)); __lwp_thread_dispatchunnest(); return ret; }
s32 LWP_InitQueue(lwpq_t *thequeue) { tqueue_st *tq; if(!thequeue) return -1; tq = __lwp_tqueue_allocate(); if(!tq) return -1; __lwp_threadqueue_init(&tq->tqueue,LWP_THREADQ_MODEFIFO,LWP_STATES_WAITING_ON_THREADQ,0); *thequeue = (lwpq_t)(LWP_OBJMASKTYPE(LWP_OBJTYPE_TQUEUE)|LWP_OBJMASKID(tq->object.id)); __lwp_thread_dispatchenable(); return 0; }
s32 LWP_CondInit(cond_t *cond) { cond_st *ret; if(!cond) return -1; ret = __lwp_cond_allocate(); if(!ret) return ENOMEM; ret->lock = LWP_MUTEX_NULL; __lwp_threadqueue_init(&ret->wait_queue,LWP_THREADQ_MODEFIFO,LWP_STATES_WAITING_FOR_CONDVAR,ETIMEDOUT); *cond = (cond_t)(LWP_OBJMASKTYPE(LWP_OBJTYPE_COND)|LWP_OBJMASKID(ret->object.id)); __lwp_thread_dispatchenable(); return 0; }
s32 MQ_Init(mqbox_t *mqbox,u32 count) { mq_attr attr; mqbox_st *ret = NULL; if(!mqbox) return -1; ret = __lwp_mqbox_allocate(); if(!ret) return MQ_ERROR_TOOMANY; attr.mode = LWP_MQ_FIFO; if(!__lwpmq_initialize(&ret->mqueue,&attr,count,sizeof(mqmsg_t))) { __lwp_mqbox_free(ret); __lwp_thread_dispatchenable(); return MQ_ERROR_TOOMANY; } *mqbox = (mqbox_t)(LWP_OBJMASKTYPE(LWP_OBJTYPE_MBOX)|LWP_OBJMASKID(ret->object.id)); __lwp_thread_dispatchenable(); return MQ_ERROR_SUCCESSFUL; }