notify: protect notify->pending with the mutex

There was a known deadlocking bug in the notify library: when the
other thread set notify->pending after the according check in
notify_wait(), the latter thread was deadlocked.  Resolve this by
synchronizing all accesses to notify->pending with the notify object's
mutex.  Since notify_signal_sync() was never used, we can remove it.
As a consequence, we don't need notify_enter() and notify_leave()
anymore; eliminate them, too.
This commit is contained in:
Max Kellermann
2008-09-26 09:57:11 +02:00
parent 323e86489f
commit 58554e14f9
6 changed files with 4 additions and 41 deletions

View File

@@ -40,32 +40,20 @@ void notify_deinit(struct notify *notify)
pthread_cond_destroy(&notify->cond);
}
void notify_enter(struct notify *notify)
{
pthread_mutex_lock(&notify->mutex);
}
void notify_leave(struct notify *notify)
{
pthread_mutex_unlock(&notify->mutex);
}
void notify_wait(struct notify *notify)
{
pthread_mutex_lock(&notify->mutex);
if (!notify->pending)
pthread_cond_wait(&notify->cond, &notify->mutex);
assert(notify->pending);
notify->pending = 0;
pthread_mutex_unlock(&notify->mutex);
}
void notify_signal(struct notify *notify)
{
pthread_mutex_lock(&notify->mutex);
notify->pending = 1;
pthread_cond_signal(&notify->cond);
}
void notify_signal_sync(struct notify *notify)
{
pthread_mutex_lock(&notify->mutex);
notify_signal(notify);
pthread_mutex_unlock(&notify->mutex);
}