int sem_timedwait(sem_t *semp, const struct timespec *abstime) { struct tib *tib = TIB_GET(); pthread_t self; sem_t sem; int r; PREP_CANCEL_POINT(tib); if (!_threads_ready) _rthread_init(); self = tib->tib_thread; if (!semp || !(sem = *semp)) { errno = EINVAL; return (-1); } ENTER_DELAYED_CANCEL_POINT(tib, self); r = _sem_wait(sem, 0, abstime, &self->delayed_cancel); LEAVE_CANCEL_POINT_INNER(tib, r); if (r) { errno = r == EWOULDBLOCK ? ETIMEDOUT : r; return (-1); } return (0); }
int sem_wait(sem_t *semp) { struct tib *tib = TIB_GET(); pthread_t self; sem_t sem; int r; PREP_CANCEL_POINT(tib); if (!_threads_ready) _rthread_init(); self = tib->tib_thread; if (!semp || !(sem = *semp)) { errno = EINVAL; return (-1); } ENTER_DELAYED_CANCEL_POINT(tib, self); r = _sem_wait(sem, 0, NULL, &self->delayed_cancel); LEAVE_CANCEL_POINT_INNER(tib, r); if (r) { errno = r; return (-1); } return (0); }
void write_task ( uint_32 initial_data ) { pointer write_sem; pointer read_sem; pointer index_sem; /* open connections to all the semaphores */ if (_sem_open("sem.write", &write_sem) != MQX_OK) { printf("\nOpening write semaphore failed."); _task_block(); } if (_sem_open("sem.index", &index_sem) != MQX_OK) { printf("\nOpening index semaphore failed."); _task_block(); } if (_sem_open("sem.read", &read_sem) != MQX_OK) { printf("\nOpening read semaphore failed."); _task_block(); } while (TRUE) { /* wait for the semphores */ if (_sem_wait(write_sem, 0) != MQX_OK) { printf("\nWwaiting for Write semaphore failed"); _task_block(); } if (_sem_wait(index_sem, 0) != MQX_OK) { printf("\nWaiting for index semaphore failed"); _task_block(); } fifo.DATA[fifo.WRITE_INDEX++] = _task_get_id(); if (fifo.WRITE_INDEX >= ARRAY_SIZE) { fifo.WRITE_INDEX = 0; } /* Post the semaphores */ _sem_post(index_sem); _sem_post(read_sem); } }
/* * sem_wait is not interrupted by signal. */ int sem_wait(sem_t *sem, unsigned long msec) { int error; do error = _sem_wait(sem, msec); while (error == EINTR); return error; }
/* Semaphore: API */ int sem_wait(sem_t *s) { if (!s) return -1; if(_sem_wait(s) != 0) { _add_listener(s); task_suspend(); return SYS_CALL_AGAIN; } _del_listener(s); return 0; }
int sem_trywait(sem_t *semp) { sem_t sem; int r; if (!semp || !(sem = *semp)) { errno = EINVAL; return (-1); } r = _sem_wait(sem, 1, NULL, NULL); if (r) { errno = r; return (-1); } return (0); }
int sem_timedwait(sem_t *semp, const struct timespec *abstime) { pthread_t self = pthread_self(); sem_t sem; int r; if (!semp || !(sem = *semp)) { errno = EINVAL; return (-1); } _enter_delayed_cancel(self); r = _sem_wait(sem, 0, abstime, &self->delayed_cancel); _leave_delayed_cancel(self, r); if (r) { errno = r == EWOULDBLOCK ? ETIMEDOUT : r; return (-1); } return (0); }
int sem_wait(sem_t *semp) { pthread_t self = pthread_self(); sem_t sem; int r; if (!semp || !(sem = *semp)) { errno = EINVAL; return (-1); } _enter_delayed_cancel(self); r = _sem_wait(sem, 0, NULL, &self->delayed_cancel); _leave_delayed_cancel(self, r); if (r) { errno = r; return (-1); } return (0); }
int pthread_join(pthread_t thread, void **retval) { int e; if (thread->tid == getthrid()) e = EDEADLK; else if (thread->flags & THREAD_DETACHED) e = EINVAL; else { _sem_wait(&thread->donesem, 0, 0); if (retval) *retval = thread->retval; e = 0; /* We should be the last having a ref to this thread, but * someone stupid or evil might haved detached it; * in that case the thread will cleanup itself */ if ((thread->flags & THREAD_DETACHED) == 0) _rthread_free(thread); } _rthread_reaper(); return (e); }