فهرست منبع

suppress masked cancellation in pthread_join

like close, pthread_join is a resource-deallocation function which is
also a cancellation point. the intent of masked cancellation mode is
to exempt such functions from failure with ECANCELED.
Rich Felker 10 سال پیش
والد
کامیت
eb4bd8d8bb
1فایلهای تغییر یافته به همراه5 افزوده شده و 1 حذف شده
  1. 5 1
      src/thread/pthread_join.c

+ 5 - 1
src/thread/pthread_join.c

@@ -3,12 +3,16 @@
 
 int __munmap(void *, size_t);
 void __pthread_testcancel(void);
+int __pthread_setcancelstate(int, int *);
 
 int __pthread_join(pthread_t t, void **res)
 {
-	int tmp;
+	int tmp, cs;
 	__pthread_testcancel();
+	__pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+	if (cs == PTHREAD_CANCEL_ENABLE) __pthread_setcancelstate(cs, 0);
 	while ((tmp = t->tid)) __timedwait_cp(&t->tid, tmp, 0, 0, 0);
+	__pthread_setcancelstate(cs, 0);
 	if (res) *res = t->result;
 	if (t->map_base) __munmap(t->map_base, t->map_size);
 	return 0;