[PATCH] Cygwin: timerfd: avoid a deadlock
Ken Brown
kbrown@cornell.edu
Tue Jun 25 13:25:00 GMT 2019
On 6/25/2019 3:43 AM, Corinna Vinschen wrote:
> Hi Ken,
>
> On Jun 24 20:19, Ken Brown wrote:
>> If a timer expires while the timerfd thread is in its inner loop,
>> check for the thread cancellation event before trying to enter
>> a_critical_section. It's possible that timerfd_tracker::dtor has
>> entered its critical section and is trying to cancel the thread. See
>> http://www.cygwin.org/ml/cygwin/2019-06/msg00096.html.
>> ---
>> winsup/cygwin/timerfd.cc | 5 +++++
>> 1 file changed, 5 insertions(+)
>>
>> diff --git a/winsup/cygwin/timerfd.cc b/winsup/cygwin/timerfd.cc
>> index 8e4c94e66..e8261ef2e 100644
>> --- a/winsup/cygwin/timerfd.cc
>> +++ b/winsup/cygwin/timerfd.cc
>> @@ -137,6 +137,11 @@ timerfd_tracker::thread_func ()
>> continue;
>> }
>>
>> + /* Avoid a deadlock if dtor has just entered its critical
>> + section and is trying to cancel the thread. */
>> + if (IsEventSignalled (cancel_evt))
>> + goto canceled;
>
> This looks still racy, what if cancel_evt is set just between the
> IsEventSignalled() and enter_critical_section() calls?
>
> Hmm.
>
> What if we redefine enter_critical_section() to return three
> states. It calls WFMO on cancel_evt and _access_mtx, in this order,
> so that a cancel event is honored. Or maybe introduce another
> function like enter_critical_section_cancelable() which is only
> called in this single instance in timerfd_tracker::thread_func?
Yes, that's much better. I'll send v2 shortly, after some testing.
Ken
More information about the Cygwin-patches
mailing list