소스 검색

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.
Rich Felker 10 년 전
부모
커밋
fff5469303
2개의 변경된 파일3개의 추가작업 그리고 0개의 파일을 삭제
  1. 1 0
      src/thread/pthread_join.c
  2. 2 0
      src/thread/sem_timedwait.c

+ 1 - 0
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);

+ 2 - 0
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;