From owner-p4-projects@FreeBSD.ORG Mon Jan 3 02:02:13 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7833F16A4CE; Mon, 3 Jan 2005 02:02:09 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8E85E16A4CF for ; Mon, 3 Jan 2005 02:02:06 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6A2FF43D2D for ; Mon, 3 Jan 2005 02:02:06 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j03226k3058584 for ; Mon, 3 Jan 2005 02:02:06 GMT (envelope-from davidxu@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j0322548058581 for perforce@freebsd.org; Mon, 3 Jan 2005 02:02:06 GMT (envelope-from davidxu@freebsd.org) Date: Mon, 3 Jan 2005 02:02:06 GMT Message-Id: <200501030202.j0322548058581@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to davidxu@freebsd.org using -f From: David Xu To: Perforce Change Reviews Subject: PERFORCE change 68182 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Jan 2005 02:02:14 -0000 http://perforce.freebsd.org/chv.cgi?CH=68182 Change 68182 by davidxu@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); }