about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-09-04 21:37:07 -0400
committerRich Felker <dalias@aerifal.cx>2011-09-04 21:37:07 -0400
commita7778dae226fbae335383bc92b6cdfccc5ea9f2e (patch)
tree3a290f99c9f397901a3011d04ba8e87907568e44
parent22e4542348352235614b57948025bdd0cc30dc32 (diff)
downloadmusl-a7778dae226fbae335383bc92b6cdfccc5ea9f2e.tar.gz
musl-a7778dae226fbae335383bc92b6cdfccc5ea9f2e.tar.xz
musl-a7778dae226fbae335383bc92b6cdfccc5ea9f2e.zip
handle pending cancellation when enabling async cancellation
this is not strictly required by the standard, but without it, there
is a race condition where cancellation arriving just before async
cancellation is enabled might not be acted upon. it is impossible for
a conforming application to work around this race condition since
calling pthread_testcancel after setting async cancellation mode is
not allowed (pthread_testcancel is not specified to be
async-cancel-safe). thus the implementation should be responsible for
eliminating the race, from a quality-of-implementation standpoint.
-rw-r--r--src/thread/pthread_setcanceltype.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/thread/pthread_setcanceltype.c b/src/thread/pthread_setcanceltype.c
index 7eb543a8..ce2fff07 100644
--- a/src/thread/pthread_setcanceltype.c
+++ b/src/thread/pthread_setcanceltype.c
@@ -6,5 +6,6 @@ int pthread_setcanceltype(int new, int *old)
 	if (new > 1U) return EINVAL;
 	if (old) *old = self->cancelasync;
 	self->cancelasync = new;
+	if (new) pthread_testcancel();
 	return 0;
 }