From owner-svn-src-user@FreeBSD.ORG Fri Nov 5 00:25:14 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3EA27106566C; Fri, 5 Nov 2010 00:25:14 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2D1248FC12; Fri, 5 Nov 2010 00:25:14 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id oA50PEer077644; Fri, 5 Nov 2010 00:25:14 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oA50PEVb077642; Fri, 5 Nov 2010 00:25:14 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <201011050025.oA50PEVb077642@svn.freebsd.org> From: David Xu Date: Fri, 5 Nov 2010 00:25:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r214815 - user/davidxu/libthr/lib/libthr/thread X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Nov 2010 00:25:14 -0000 Author: davidxu Date: Fri Nov 5 00:25:13 2010 New Revision: 214815 URL: http://svn.freebsd.org/changeset/base/214815 Log: Move clock_gettime() after lock released. we should have another UMTX_OP_WAIT with absolute timeout to save syscalls. Modified: user/davidxu/libthr/lib/libthr/thread/thr_cond.c Modified: user/davidxu/libthr/lib/libthr/thread/thr_cond.c ============================================================================== --- user/davidxu/libthr/lib/libthr/thread/thr_cond.c Fri Nov 5 00:07:56 2010 (r214814) +++ user/davidxu/libthr/lib/libthr/thread/thr_cond.c Fri Nov 5 00:25:13 2010 (r214815) @@ -224,18 +224,18 @@ cond_wait_user(pthread_cond_t *cond, pth return (ret); } - if (abstime != NULL) { - clock_gettime(cv->c_kerncv.c_clockid, &ts); - TIMESPEC_SUB(&ts2, abstime, &ts); - tsp = &ts2; - } else - tsp = NULL; - bseq = cv->c_broadcast_seq; for(;;) { seq = cv->c_seq; THR_UMUTEX_UNLOCK(curthread, &cv->c_lock); + if (abstime != NULL) { + clock_gettime(cv->c_kerncv.c_clockid, &ts); + TIMESPEC_SUB(&ts2, abstime, &ts); + tsp = &ts2; + } else + tsp = NULL; + if (cancel) { _thr_cancel_enter2(curthread, 0); ret = _thr_umtx_wait_uint((u_int *)&cv->c_seq, @@ -255,10 +255,12 @@ cond_wait_user(pthread_cond_t *cond, pth cv->c_signaled--; ret = 0; break; + } else if (ret == ETIMEDOUT) { + break; } else if (cancel && SHOULD_CANCEL(curthread) && !THR_IN_CRITICAL(curthread)) { - THR_UMUTEX_UNLOCK(curthread, &cv->c_lock); - _pthread_exit(PTHREAD_CANCELED); + THR_UMUTEX_UNLOCK(curthread, &cv->c_lock); + _pthread_exit(PTHREAD_CANCELED); } } THR_UMUTEX_UNLOCK(curthread, &cv->c_lock); @@ -289,6 +291,7 @@ cond_wait_common(pthread_cond_t *cond, p return (err); m = *mutex; + if ((m->m_lock.m_flags & USYNC_PROCESS_SHARED) != (cv->c_kerncv.c_flags & USYNC_PROCESS_SHARED)) return (EINVAL);