u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t count) { LWIP_ASSERT("invalid semaphor", sys_sem_valid(sem)); if (count != 0) { uint64_t stop, start; start = xtimer_now_usec64(); int res = sema_wait_timed((sema_t *)sem, count * US_PER_MS); stop = xtimer_now_usec64() - start; if (res == -ETIMEDOUT) { return SYS_ARCH_TIMEOUT; } return (u32_t)(stop / US_PER_MS); } else { sema_wait_timed((sema_t *)sem, 0); return 0; } }
void sys_mbox_post(sys_mbox_t *mbox, void *msg) { int idx; LWIP_ASSERT("invalid mbox", sys_mbox_valid(mbox)); mutex_lock(&mbox->mutex); while ((idx = cib_put(&mbox->cib)) < 0) { mbox->waiting++; mutex_unlock(&mbox->mutex); sema_wait_timed(&mbox->not_full, 0); mutex_lock(&mbox->mutex); mbox->waiting--; } mbox->msgs[idx] = msg; if (cib_avail(&mbox->cib) == 1) { sema_post(&mbox->not_empty); } mutex_unlock(&mbox->mutex); }