about summary refs log tree commit diff
path: root/src/mq
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2023-02-10 11:17:02 -0500
committerRich Felker <dalias@aerifal.cx>2023-02-11 13:00:37 -0500
commitfde6891e59c315e4a0ec7e69182e1d6314e3795e (patch)
tree44059556ab95c35b351b6e21d4afd906753f8b3a /src/mq
parentc3cd04fa5fecd2c349aefde090c602554ee4fa24 (diff)
downloadmusl-fde6891e59c315e4a0ec7e69182e1d6314e3795e.tar.gz
musl-fde6891e59c315e4a0ec7e69182e1d6314e3795e.tar.xz
musl-fde6891e59c315e4a0ec7e69182e1d6314e3795e.zip
mq_notify: use semaphore instead of barrier to sync args consumption
semaphores are a much lighter primitive, and more idiomatic with
current usage in the code base.
Diffstat (limited to 'src/mq')
-rw-r--r--src/mq/mq_notify.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/mq/mq_notify.c b/src/mq/mq_notify.c
index 221591c7..a42888d2 100644
--- a/src/mq/mq_notify.c
+++ b/src/mq/mq_notify.c
@@ -4,10 +4,11 @@
 #include <sys/socket.h>
 #include <signal.h>
 #include <unistd.h>
+#include <semaphore.h>
 #include "syscall.h"
 
 struct args {
-	pthread_barrier_t barrier;
+	sem_t sem;
 	int sock;
 	const struct sigevent *sev;
 };
@@ -21,7 +22,7 @@ static void *start(void *p)
 	void (*func)(union sigval) = args->sev->sigev_notify_function;
 	union sigval val = args->sev->sigev_value;
 
-	pthread_barrier_wait(&args->barrier);
+	sem_post(&args->sem);
 	n = recv(s, buf, sizeof(buf), MSG_NOSIGNAL|MSG_WAITALL);
 	close(s);
 	if (n==sizeof buf && buf[sizeof buf - 1] == 1)
@@ -37,6 +38,7 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev)
 	int s;
 	struct sigevent sev2;
 	static const char zeros[32];
+	int cs;
 
 	if (!sev || sev->sigev_notify != SIGEV_THREAD)
 		return syscall(SYS_mq_notify, mqd, sev);
@@ -48,7 +50,7 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev)
 	if (sev->sigev_notify_attributes) attr = *sev->sigev_notify_attributes;
 	else pthread_attr_init(&attr);
 	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-	pthread_barrier_init(&args.barrier, 0, 2);
+	sem_init(&args.sem, 0, 0);
 
 	if (pthread_create(&td, &attr, start, &args)) {
 		__syscall(SYS_close, s);
@@ -56,8 +58,10 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev)
 		return -1;
 	}
 
-	pthread_barrier_wait(&args.barrier);
-	pthread_barrier_destroy(&args.barrier);
+	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+	sem_wait(&args.sem);
+	pthread_setcancelstate(cs, 0);
+	sem_destroy(&args.sem);
 
 	sev2.sigev_notify = SIGEV_THREAD;
 	sev2.sigev_signo = s;