musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014年09月05日 03:22:52 -0400
committerRich Felker <dalias@aerifal.cx>2014年09月05日 03:22:52 -0400
commitfff546930347d99729f1c0a9d911e7f24a094531 (patch)
tree59c0bf452ec99eff7f8cc1d477999633af28705f /src
parent80e6485455a9c75c029d0e976d2dd9c8e441dd72 (diff)
downloadmusl-fff546930347d99729f1c0a9d911e7f24a094531.tar.gz
make non-waiting paths of sem_[timed]wait and pthread_join cancelable
per POSIX these functions are both cancellation points, so they must act on any cancellation request which is pending prior to the call. previously, only the code path where actual waiting took place could act on cancellation.
Diffstat (limited to 'src')
-rw-r--r--src/thread/pthread_join.c 1
-rw-r--r--src/thread/sem_timedwait.c 2
2 files changed, 3 insertions, 0 deletions
diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c
index 719c91ca..abd2d668 100644
--- a/src/thread/pthread_join.c
+++ b/src/thread/pthread_join.c
@@ -8,6 +8,7 @@ static void dummy(void *p)
int pthread_join(pthread_t t, void **res)
{
int tmp;
+ pthread_testcancel();
while ((tmp = t->tid)) __timedwait(&t->tid, tmp, 0, 0, dummy, 0, 0);
if (res) *res = t->result;
if (t->map_base) munmap(t->map_base, t->map_size);
diff --git a/src/thread/sem_timedwait.c b/src/thread/sem_timedwait.c
index b5a60add..68dcb504 100644
--- a/src/thread/sem_timedwait.c
+++ b/src/thread/sem_timedwait.c
@@ -8,6 +8,8 @@ static void cleanup(void *p)
int sem_timedwait(sem_t *restrict sem, const struct timespec *restrict at)
{
+ pthread_testcancel();
+
if (!sem_trywait(sem)) return 0;
int spins = 100;
generated by cgit v1.2.1 (git 2.18.0) at 2025年10月07日 23:40:36 +0000

AltStyle によって変換されたページ (->オリジナル) /