소스 검색

more efficient signal blocking for timer threads

due to the barrier, it's safe just to block signals in the new thread,
rather than blocking and unblocking in the parent thread.
Rich Felker 13 년 전
부모
커밋
b1a7102d83
1개의 변경된 파일4개의 추가작업 그리고 4개의 파일을 삭제
  1. 4 4
      src/time/timer_create.c

+ 4 - 4
src/time/timer_create.c

@@ -58,6 +58,7 @@ static void *start(void *arg)
 {
 	pthread_t self = __pthread_self();
 	struct start_args *args = arg;
+	sigset_t set;
 
 	/* Reuse no-longer-needed thread structure fields to avoid
 	 * needing the timer address in the signal handler. */
@@ -65,6 +66,9 @@ static void *start(void *arg)
 	self->start_arg = args->sev->sigev_value.sival_ptr;
 	self->result = (void *)-1;
 
+	sigfillset(&set);
+	pthread_sigmask(SIG_BLOCK, &set, 0);
+
 	pthread_barrier_wait(&args->b);
 	__wait(&self->delete_timer, 0, 0, 1);
 	__syscall(SYS_timer_delete, self->result);
@@ -80,7 +84,6 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
 	struct start_args args;
 	struct ksigevent ksev, *ksevp=0;
 	int timerid;
-	sigset_t set;
 
 	switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
 	case SIGEV_NONE:
@@ -105,10 +108,7 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
 		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 		pthread_barrier_init(&args.b, 0, 2);
 		args.sev = evp;
-		sigfillset(&set);
-		pthread_sigmask(SIG_BLOCK, &set, &set);
 		r = pthread_create(&td, &attr, start, &args);
-		pthread_sigmask(SIG_SETMASK, &set, 0);
 		if (r) {
 			errno = r;
 			return -1;