From: Paolo Bonzini <bonzini@gnu.org>
To: Johannes Sixt <j.sixt@viscovery.net>
Cc: git@vger.kernel.org
Subject: Re: [RFT PATCH 1/2] win32: optimize condition variable implementation
Date: Tue, 08 Jun 2010 18:27:08 +0200 [thread overview]
Message-ID: <4C0E6F5C.6050809@gnu.org> (raw)
In-Reply-To: <4C0E6CC2.1080605@viscovery.net>
On 06/08/2010 06:16 PM, Johannes Sixt wrote:
> This is not correct. While it is not possible that two threads increment
> waiters at the same time due to the external mutex, it is still possible
> that on thread increments, and a different one decrements. You lost all
> provisions to avoid that.
Actually, the patch is only relying more widely on the preexisting
assumptions of the code:
/*
* IMPORTANT: This implementation requires that pthread_cond_signal
* is called while the mutex is held that is used in the corresponding
* pthread_cond_wait calls!
*/
/*
* IMPORTANT: This implementation requires that pthread_cond_broadcast
* is called while the mutex is held that is used in the corresponding
* pthread_cond_wait calls!
*/
During the locked decrements, but then the external mutex is held by the
thread executing pthread_cond_signal/pthread_cond_broadcast, so that
section of the code is still protected against increments.
> Furthermore, waiters_lock not only protects waiters, but also the
> combined state of waiters and was_broadcast.
Concurrent pthread_cond_broadcast are protected by the external mutex,
and was_broadcast is similarly protected against increments of waiters.
Futhermore, access to was_broadcast is serialized between
pthread_cond_wait and pthread_cond_broadcast through the semaphore and
the event. was_broadcast may change from 0 to 1 while pthread_cond_wait
is not holding the external mutex, but then pthread_cond_wait is
sleeping on the semaphore or will go to sleep very soon. And it can
change from 1 to 0 only after pthread_cond_wait has signaled the event,
which means pthread_cond_wait will be waiting to reacquire the external
mutex.
Paolo
next prev parent reply other threads:[~2010-06-08 16:27 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-07 13:38 [RFT PATCH 0/2] win32: optimize emulation of condition variables Paolo Bonzini
2010-06-07 13:38 ` [RFT PATCH 1/2] win32: optimize condition variable implementation Paolo Bonzini
2010-06-08 16:16 ` Johannes Sixt
2010-06-08 16:27 ` Paolo Bonzini [this message]
2010-06-07 13:38 ` [RFT PATCH 2/2] win32: optimize pthread_cond_broadcast Paolo Bonzini
2010-06-08 16:30 ` Johannes Sixt
2010-06-08 16:37 ` Paolo Bonzini
2010-06-08 18:46 ` Johannes Sixt
2010-06-13 10:16 ` [PATCH 3/2] fix race in win32 pthread_cond_signal causing spurious wakeups Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C0E6F5C.6050809@gnu.org \
--to=bonzini@gnu.org \
--cc=git@vger.kernel.org \
--cc=j.sixt@viscovery.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.