Commit e9ffcf98 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Android: remove contention in vlc_cond_wait()

parent 3405b7da
...@@ -216,36 +216,65 @@ void vlc_cond_broadcast (vlc_cond_t *condvar) ...@@ -216,36 +216,65 @@ void vlc_cond_broadcast (vlc_cond_t *condvar)
void vlc_cond_wait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex) void vlc_cond_wait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex)
{ {
if (thread) { vlc_thread_t th = thread;
vlc_testcancel();
vlc_mutex_lock(&thread->lock); if (th != NULL)
thread->cond = &condvar->cond; {
vlc_mutex_unlock(&thread->lock); vlc_testcancel ();
if (vlc_mutex_trylock (&th->lock) == 0)
{
th->cond = &condvar->cond;
vlc_mutex_unlock (&th->lock);
}
else
{ /* The lock is already held by another thread.
* => That other thread has just cancelled this one. */
vlc_testcancel ();
/* Cancellation did not occur even though this thread is cancelled.
* => Cancellation is disabled. */
th = NULL;
}
} }
int val = pthread_cond_wait (&condvar->cond, p_mutex); int val = pthread_cond_wait (&condvar->cond, p_mutex);
VLC_THREAD_ASSERT ("waiting on condition");
if (thread) { if (th != NULL)
vlc_mutex_lock(&thread->lock); {
thread->cond = NULL; if (vlc_mutex_trylock (&th->lock) == 0)
vlc_mutex_unlock(&thread->lock); {
thread->cond = NULL;
vlc_mutex_unlock (&th->lock);
}
/* Else: This thread was cancelled and is cancellable.
vlc_testcancel() will take of it right there: */
vlc_testcancel(); vlc_testcancel();
} }
VLC_THREAD_ASSERT ("waiting on condition");
} }
int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex, int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
mtime_t deadline) mtime_t deadline)
{ {
struct timespec ts = mtime_to_ts (deadline); struct timespec ts = mtime_to_ts (deadline);
vlc_thread_t th = thread;
int (*cb)(pthread_cond_t *, pthread_mutex_t *, const struct timespec *); int (*cb)(pthread_cond_t *, pthread_mutex_t *, const struct timespec *);
if (thread) { if (th != NULL)
vlc_testcancel(); {
vlc_mutex_lock(&thread->lock); vlc_testcancel ();
thread->cond = &condvar->cond; if (vlc_mutex_trylock (&th->lock) == 0)
vlc_mutex_unlock(&thread->lock); {
th->cond = &condvar->cond;
vlc_mutex_unlock (&th->lock);
}
else
{ /* The lock is already held by another thread.
* => That other thread has just cancelled this one. */
vlc_testcancel ();
/* Cancellation did not occur even though this thread is cancelled.
* => Cancellation is disabled. */
th = NULL;
}
} }
switch (condvar->clock) switch (condvar->clock)
...@@ -264,13 +293,17 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex, ...@@ -264,13 +293,17 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
if (val != ETIMEDOUT) if (val != ETIMEDOUT)
VLC_THREAD_ASSERT ("timed-waiting on condition"); VLC_THREAD_ASSERT ("timed-waiting on condition");
if (thread) { if (th != NULL)
vlc_mutex_lock(&thread->lock); {
thread->cond = NULL; if (vlc_mutex_trylock (&th->lock) == 0)
vlc_mutex_unlock(&thread->lock); {
thread->cond = NULL;
vlc_mutex_unlock (&th->lock);
}
/* Else: This thread was cancelled and is cancellable.
vlc_testcancel() will take of it right there: */
vlc_testcancel(); vlc_testcancel();
} }
return val; return val;
} }
......
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