}
+int sem_timedwait(sem_t* sem, const struct timespec *abstime)
+{
+ int res;
+ vg_sem_t* vg_sem;
+ ensure_valgrind("sem_timedwait");
+ vg_sem = se_remap(sem);
+ res = __pthread_mutex_lock(&vg_sem->se_mx);
+ my_assert(res == 0);
+ while ( vg_sem->count == 0 && res != ETIMEDOUT ) {
+ res = pthread_cond_timedwait(&vg_sem->se_cv, &vg_sem->se_mx, abstime);
+ }
+ if ( vg_sem->count > 0 ) {
+ vg_sem->count--;
+ res = __pthread_mutex_unlock(&vg_sem->se_mx);
+ my_assert(res == 0 );
+ return 0;
+ } else {
+ res = __pthread_mutex_unlock(&vg_sem->se_mx);
+ my_assert(res == 0 );
+ *(__errno_location()) = ETIMEDOUT;
+ return -1;
+ }
+}
+
+
/* ---------------------------------------------------------------------
Reader-writer locks.
------------------------------------------------------------------ */
//void raise ( void ) { unimp("raise"); }
void sem_close ( void ) { unimp("sem_close"); }
void sem_open ( void ) { unimp("sem_open"); }
-void sem_timedwait ( void ) { unimp("sem_timedwait"); }
+//void sem_timedwait ( void ) { unimp("sem_timedwait"); }
void sem_unlink ( void ) { unimp("sem_unlink"); }
//void sigaction ( void ) { unimp("sigaction"); }
//void siglongjmp ( void ) { unimp("siglongjmp"); }