void vlc_sem_wait (vlc_sem_t *sem) { ULONG rc; do { vlc_testcancel (); DosRequestMutexSem(sem->wait_mutex, SEM_INDEFINITE_WAIT); rc = vlc_WaitForSingleObject (sem->hev, SEM_INDEFINITE_WAIT ); if (!rc) { DosRequestMutexSem(sem->count_mutex, SEM_INDEFINITE_WAIT); sem->count--; if (sem->count == 0) { ULONG ulPost; DosResetEventSem(sem->hev, &ulPost); } DosReleaseMutexSem(sem->count_mutex); } DosReleaseMutexSem(sem->wait_mutex); } while (rc == ERROR_INTERRUPT); }
void vlc_join (vlc_thread_t th, void **result) { do vlc_testcancel (); while (vlc_WaitForSingleObject (th->id, INFINITE) == WAIT_IO_COMPLETION); if (result != NULL) *result = th->data; CloseHandle (th->id); free (th); }
void vlc_sem_wait (vlc_sem_t *sem) { DWORD result; do { vlc_testcancel (); result = vlc_WaitForSingleObject (*sem, INFINITE); } while (result == WAIT_IO_COMPLETION); }
void vlc_join (vlc_thread_t th, void **result) { ULONG rc; do { vlc_testcancel(); rc = vlc_WaitForSingleObject( th->done_event, SEM_INDEFINITE_WAIT ); } while( rc == ERROR_INTERRUPT ); if (result != NULL) *result = th->data; DosCloseEventSem( th->cancel_event ); DosCloseEventSem( th->done_event ); free( th ); }
int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex, mtime_t deadline) { ULONG ulTimeout; ULONG ulPost; ULONG rc; if (!p_condvar->hev) { /* FIXME FIXME FIXME */ msleep (50000); return; } do { vlc_testcancel(); mtime_t total; switch (p_condvar->clock) { case CLOCK_REALTIME: /* FIXME? sub-second precision */ total = CLOCK_FREQ * time (NULL); break; default: assert (p_condvar->clock == CLOCK_MONOTONIC); total = mdate(); break; } total = (deadline - total) / 1000; if( total < 0 ) total = 0; ulTimeout = ( total > 0x7fffffff ) ? 0x7fffffff : total; vlc_mutex_unlock (p_mutex); rc = vlc_WaitForSingleObject( p_condvar->hev, ulTimeout ); vlc_mutex_lock (p_mutex); } while( rc == ERROR_INTERRUPT ); DosResetEventSem( p_condvar->hev, &ulPost ); return rc ? ETIMEDOUT : 0; }
int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex, mtime_t deadline) { DWORD result; if (!p_condvar->handle) { /* FIXME FIXME FIXME */ msleep (50000); return 0; } do { vlc_testcancel (); mtime_t total; switch (p_condvar->clock) { case CLOCK_REALTIME: /* FIXME? sub-second precision */ total = CLOCK_FREQ * time (NULL); break; default: assert (p_condvar->clock == CLOCK_MONOTONIC); total = mdate(); break; } total = (deadline - total) / 1000; if( total < 0 ) total = 0; DWORD delay = (total > 0x7fffffff) ? 0x7fffffff : total; vlc_mutex_unlock (p_mutex); result = vlc_WaitForSingleObject (p_condvar->handle, delay); vlc_mutex_lock (p_mutex); } while (result == WAIT_IO_COMPLETION); ResetEvent (p_condvar->handle); return (result == WAIT_OBJECT_0) ? 0 : ETIMEDOUT; }
void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex) { DWORD result; if (!p_condvar->clock) { /* FIXME FIXME FIXME */ msleep (50000); return; } do { vlc_testcancel (); vlc_mutex_unlock (p_mutex); result = vlc_WaitForSingleObject (p_condvar->handle, INFINITE); vlc_mutex_lock (p_mutex); } while (result == WAIT_IO_COMPLETION); ResetEvent (p_condvar->handle); }
void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex) { ULONG ulPost; ULONG rc; if (!p_condvar->hev) { /* FIXME FIXME FIXME */ msleep (50000); return; } do { vlc_testcancel(); vlc_mutex_unlock (p_mutex); rc = vlc_WaitForSingleObject( p_condvar->hev, SEM_INDEFINITE_WAIT ); vlc_mutex_lock (p_mutex); } while( rc == ERROR_INTERRUPT ); DosResetEventSem( p_condvar->hev, &ulPost ); }