summaryrefslogtreecommitdiffstats
path: root/lib/libthr/thread/thr_cancel.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libthr/thread/thr_cancel.c')
-rw-r--r--lib/libthr/thread/thr_cancel.c41
1 files changed, 11 insertions, 30 deletions
diff --git a/lib/libthr/thread/thr_cancel.c b/lib/libthr/thread/thr_cancel.c
index 943d53c..e408e03 100644
--- a/lib/libthr/thread/thr_cancel.c
+++ b/lib/libthr/thread/thr_cancel.c
@@ -85,14 +85,11 @@ _pthread_setcancelstate(int state, int *oldstate)
oldval = curthread->cancel_enable;
switch (state) {
case PTHREAD_CANCEL_DISABLE:
- THR_LOCK(curthread);
curthread->cancel_enable = 0;
- THR_UNLOCK(curthread);
break;
case PTHREAD_CANCEL_ENABLE:
- THR_LOCK(curthread);
curthread->cancel_enable = 1;
- THR_UNLOCK(curthread);
+ testcancel(curthread);
break;
default:
return (EINVAL);
@@ -136,23 +133,22 @@ _pthread_testcancel(void)
{
struct pthread *curthread = _get_curthread();
- _thr_cancel_enter(curthread);
- _thr_cancel_leave(curthread);
+ curthread->cancel_point = 1;
+ testcancel(curthread);
+ curthread->cancel_point = 0;
}
void
_thr_cancel_enter(struct pthread *curthread)
{
- curthread->cancel_point++;
- if (curthread->cancel_enable)
- testcancel(curthread);
+ curthread->cancel_point = 1;
+ testcancel(curthread);
}
void
-_thr_cancel_enter_defer(struct pthread *curthread, int maycancel)
+_thr_cancel_enter2(struct pthread *curthread, int maycancel)
{
- curthread->cancel_defer++;
- curthread->cancel_point++;
+ curthread->cancel_point = 1;
if (__predict_false(SHOULD_CANCEL(curthread) &&
!THR_IN_CRITICAL(curthread))) {
if (!maycancel)
@@ -163,24 +159,9 @@ _thr_cancel_enter_defer(struct pthread *curthread, int maycancel)
}
void
-_thr_cancel_leave(struct pthread *curthread)
-{
- curthread->cancel_point--;
-}
-
-void
-_thr_cancel_leave2(struct pthread *curthread, int maycancel)
-{
- if (curthread->cancel_enable && maycancel)
- testcancel(curthread);
- curthread->cancel_point--;
-}
-
-void
-_thr_cancel_leave_defer(struct pthread *curthread, int maycancel)
+_thr_cancel_leave(struct pthread *curthread, int maycancel)
{
- if (curthread->cancel_enable && maycancel)
+ if (maycancel)
testcancel(curthread);
- curthread->cancel_point--;
- curthread->cancel_defer--;
+ curthread->cancel_point = 0;
}
OpenPOWER on IntegriCloud