static struct wind_task *find_wind_task_or_self(TASK_ID tid) { if (tid) return find_wind_task(tid); return wind_task_current(); }
static STATUS msem_take(struct wind_sem *sem, int timeout) { struct wind_task *current; struct timespec ts; int ret; if (threadobj_irq_p()) return S_intLib_NOT_ISR_CALLABLE; /* * We allow threads from other APIs to grab a VxWorks mutex * ignoring the safe option in such a case. */ current = wind_task_current(); if (current && (sem->options & SEM_DELETE_SAFE)) __RT(pthread_mutex_lock(¤t->safelock)); if (timeout == NO_WAIT) { ret = __RT(pthread_mutex_trylock(&sem->u.msem.lock)); goto check; } if (timeout == WAIT_FOREVER) { ret = __RT(pthread_mutex_lock(&sem->u.msem.lock)); goto check; } __clockobj_ticks_to_timeout(&wind_clock, CLOCK_REALTIME, timeout, &ts); ret = __RT(pthread_mutex_timedlock(&sem->u.msem.lock, &ts)); check: switch (ret) { case 0: return OK; case EINVAL: ret = S_objLib_OBJ_ID_ERROR; break; case EBUSY: ret = S_objLib_OBJ_UNAVAILABLE; break; case ETIMEDOUT: ret = S_objLib_OBJ_TIMEOUT; break; case EOWNERDEAD: case ENOTRECOVERABLE: warning("owner of mutex-type semaphore %p died", sem); ret = S_objLib_OBJ_UNAVAILABLE; break; } if (current != NULL && (sem->options & SEM_DELETE_SAFE)) __RT(pthread_mutex_unlock(¤t->safelock)); return ret; }
struct wind_task *get_wind_task_or_self(TASK_ID tid) { struct wind_task *current; if (tid) return get_wind_task(tid); current = wind_task_current(); if (current == NULL) return NULL; /* This one might block but can't fail, it is ours. */ threadobj_lock(¤t->thobj); return current; }
static STATUS msem_give(struct wind_sem *sem) { struct wind_task *current; int ret; if (threadobj_irq_p()) return S_intLib_NOT_ISR_CALLABLE; ret = __RT(pthread_mutex_unlock(&sem->u.msem.lock)); if (ret == EINVAL) return S_objLib_OBJ_ID_ERROR; if (ret == EPERM) return S_semLib_INVALID_OPERATION; if (sem->options & SEM_DELETE_SAFE) { current = wind_task_current(); if (current) __RT(pthread_mutex_unlock(¤t->safelock)); } return OK; }