PERFORCE change 68182 for review
David Xu
davidxu at FreeBSD.org
Mon Jan 3 02:02:14 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=68182
Change 68182 by davidxu at davidxu_celeron on 2005/01/03 02:01:16
simplify code.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_cancel.c#6 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_cancel.c#6 (text+ko) ====
@@ -39,17 +39,19 @@
_pthread_cancel(pthread_t pthread)
{
struct pthread *curthread = _get_curthread();
- int oldval, newval, ret;
+ int oldval, newval = 0;
+ int ret;
if ((ret = _thr_ref_add(curthread, pthread, 0)) != 0)
return (ret);
+
do {
oldval = pthread->cancelflags;
if (oldval & THR_CANCEL_NEEDED)
break;
newval = oldval | THR_CANCEL_NEEDED;
} while (!atomic_cmpset_acq_int(&pthread->cancelflags, oldval, newval));
-
+
if (!(oldval & THR_CANCEL_NEEDED) && SHOULD_ASYNC_CANCEL(newval))
thr_kill(pthread->tid, SIGCANCEL);
@@ -57,78 +59,75 @@
return (0);
}
+static inline void
+testcancel(struct pthread *curthread)
+{
+ int newval;
+
+ newval = curthread->cancelflags;
+ if (SHOULD_CANCEL(newval))
+ pthread_exit(PTHREAD_CANCELED);
+}
+
int
_pthread_setcancelstate(int state, int *oldstate)
{
struct pthread *curthread = _get_curthread();
- int oldval, newval;
+ int oldval, ret;
- if (state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE)
- return (EINVAL);
+ oldval = curthread->cancelflags;
+ if (oldstate != NULL)
+ *oldstate = ((oldval & THR_CANCEL_DISABLE) ?
+ PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE);
+ switch (state) {
+ case PTHREAD_CANCEL_DISABLE:
+ atomic_set_int(&curthread->cancelflags, THR_CANCEL_DISABLE);
+ ret = 0;
+ break;
+ case PTHREAD_CANCEL_ENABLE:
+ atomic_clear_int(&curthread->cancelflags, THR_CANCEL_DISABLE);
+ testcancel(curthread);
+ ret = 0;
+ break;
+ default:
+ ret = EINVAL;
+ }
- for (;;) {
- oldval = curthread->cancelflags;
- newval = (state == PTHREAD_CANCEL_DISABLE ?
- oldval | THR_CANCEL_DISABLE :
- oldval & ~THR_CANCEL_DISABLE);
-
- if (oldstate != NULL)
- *oldstate = ((oldval & THR_CANCEL_DISABLE) ?
- PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE);
-
- if (oldval == newval)
- break;
-
- if (atomic_cmpset_acq_int(&curthread->cancelflags, oldval,
- newval)) {
- if (SHOULD_CANCEL(newval))
- pthread_exit(PTHREAD_CANCELED);
- break;
- }
- }
-
- return (0);
+ return (ret);
}
int
_pthread_setcanceltype(int type, int *oldtype)
{
struct pthread *curthread = _get_curthread();
- int oldval, newval;
+ int oldval, ret;
- if (type != PTHREAD_CANCEL_DEFERRED &&
- type != PTHREAD_CANCEL_ASYNCHRONOUS)
- return (EINVAL);
-
- for (;;) {
- oldval = curthread->cancelflags;
- if (oldtype != NULL)
- *oldtype = ((oldval & THR_CANCEL_AT_POINT) ?
+ oldval = curthread->cancelflags;
+ if (oldtype != NULL)
+ *oldtype = ((oldval & THR_CANCEL_AT_POINT) ?
PTHREAD_CANCEL_ASYNCHRONOUS :
PTHREAD_CANCEL_DEFERRED);
- newval = (type == PTHREAD_CANCEL_ASYNCHRONOUS ?
- oldval | THR_CANCEL_AT_POINT :
- oldval & ~THR_CANCEL_AT_POINT);
- if (oldval == newval)
- break;
- if (atomic_cmpset_acq_int(&curthread->cancelflags, oldval,
- newval)) {
- if (SHOULD_CANCEL(newval))
- pthread_exit(PTHREAD_CANCELED);
- break;
- }
+ switch (type) {
+ case PTHREAD_CANCEL_ASYNCHRONOUS:
+ atomic_set_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
+ testcancel(curthread);
+ ret = 0;
+ break;
+ case PTHREAD_CANCEL_DEFERRED:
+ atomic_clear_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
+ ret = 0;
+ break;
+ default:
+ ret = EINVAL;
}
-
- return (0);
+
+ return (ret);
}
void
_pthread_testcancel(void)
{
- struct pthread *curthread = _get_curthread();
-
- if (SHOULD_CANCEL(curthread->cancelflags))
- pthread_exit(PTHREAD_CANCELED);
+ testcancel(_get_curthread());
}
int
@@ -136,16 +135,10 @@
{
int oldval;
- for (;;) {
- oldval = curthread->cancelflags;
- if (oldval & THR_CANCEL_AT_POINT)
- break;
- int newval = oldval | THR_CANCEL_AT_POINT;
- if (atomic_cmpset_acq_int(&curthread->cancelflags, oldval,
- newval)) {
- if (SHOULD_CANCEL(newval))
- pthread_exit(PTHREAD_CANCELED);
- }
+ oldval = curthread->cancelflags;
+ if (!(oldval & THR_CANCEL_AT_POINT)) {
+ atomic_set_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
+ testcancel(curthread);
}
return (oldval);
}
More information about the p4-projects
mailing list