Commit 35289585 authored by Damien Fouilleul's avatar Damien Fouilleul

vlc_threads: document gibalou's comment, and fix a small bug in win32 vlc_cond_timedwait()

parent 55709f03
...@@ -261,6 +261,11 @@ static inline int __vlc_cond_signal( const char * psz_file, int i_line, ...@@ -261,6 +261,11 @@ static inline int __vlc_cond_signal( const char * psz_file, int i_line,
* by a mutex. This will prevent another thread from stealing the signal */ * by a mutex. This will prevent another thread from stealing the signal */
if( !p_condvar->semaphore ) if( !p_condvar->semaphore )
{ {
/*
** PulseEvent() only works if none of the waiting threads is suspended.
** this is particularily problematic under a debug session.
** as documented in http://support.microsoft.com/kb/q173260/
*/
PulseEvent( p_condvar->event ); PulseEvent( p_condvar->event );
} }
else if( p_condvar->i_win9x_cv == 1 ) else if( p_condvar->i_win9x_cv == 1 )
...@@ -570,7 +575,7 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line, ...@@ -570,7 +575,7 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line,
DWORD result; DWORD result;
if( delay_ms < 0 ) if( delay_ms < 0 )
delay_ms = 0; delay_ms = 0;
p_condvar->i_waiting_threads++; p_condvar->i_waiting_threads++;
LeaveCriticalSection( &p_mutex->csection ); LeaveCriticalSection( &p_mutex->csection );
...@@ -587,7 +592,7 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line, ...@@ -587,7 +592,7 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line,
mtime_t delay_ms = (deadline - mdate())/1000; mtime_t delay_ms = (deadline - mdate())/1000;
if( delay_ms < 0 ) if( delay_ms < 0 )
delay_ms = 0; delay_ms = 0;
if( !p_condvar->semaphore ) if( !p_condvar->semaphore )
{ {
...@@ -618,17 +623,19 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line, ...@@ -618,17 +623,19 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line,
/* Wait for the gate to be open */ /* Wait for the gate to be open */
result = WaitForSingleObject( p_condvar->event, delay_ms ); result = WaitForSingleObject( p_condvar->event, delay_ms );
/* recaculate remaining delay */
delay_ms = (deadline - mdate())/1000;
if( delay_ms < 0 )
delay_ms = 0;
/* Increase our wait count */ /* Increase our wait count */
p_condvar->i_waiting_threads++; p_condvar->i_waiting_threads++;
LeaveCriticalSection( &p_mutex->csection ); LeaveCriticalSection( &p_mutex->csection );
if( !result ) if( !result )
result = WaitForSingleObject( p_condvar->semaphore, delay_ms ); {
/* recaculate remaining delay */
delay_ms = (deadline - mdate())/1000;
if( delay_ms < 0 )
delay_ms = 0;
result = WaitForSingleObject( p_condvar->semaphore, delay_ms );
}
/* Decrement and test must be atomic */ /* Decrement and test must be atomic */
EnterCriticalSection( &p_condvar->csection ); EnterCriticalSection( &p_condvar->csection );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment