From owner-p4-projects@FreeBSD.ORG Wed Nov 12 01:14:51 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B7C7A106567C; Wed, 12 Nov 2008 01:14:51 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 633561065694 for ; Wed, 12 Nov 2008 01:14:51 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 54E788FC12 for ; Wed, 12 Nov 2008 01:14:51 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id mAC1Ep09010350 for ; Wed, 12 Nov 2008 01:14:51 GMT (envelope-from peter-gmail@wemm.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id mAC1Eprw010348 for perforce@freebsd.org; Wed, 12 Nov 2008 01:14:51 GMT (envelope-from peter-gmail@wemm.org) Date: Wed, 12 Nov 2008 01:14:51 GMT Message-Id: <200811120114.mAC1Eprw010348@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter-gmail@wemm.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 152839 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 Nov 2008 01:14:52 -0000 http://perforce.freebsd.org/chv.cgi?CH=152839 Change 152839 by peter@peter_hammer on 2008/11/12 01:14:49 Try and limit the amount of async wakeups going on outside the BigLock. If the wake calls happen in sync mode, then we hold BigLock and can't race the interpreter this way. Affected files ... .. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#31 edit Differences ... ==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#31 (text+ko) ==== @@ -1907,7 +1907,8 @@ PRE(sys__umtx_op) { - *flags |= SfMayBlock; +// ThreadState *tst; + /* 5 args are always passed through. The last two can vary, but they're always pointers. They may not be used though. */ switch(ARG2) { @@ -1920,6 +1921,7 @@ if (ARG5) PRE_MEM_READ( "_umtx_op_lock(timespec)", ARG5, sizeof(struct vki_timespec) ); PRE_MEM_WRITE( "_umtx_op_lock(mtx)", ARG1, sizeof(struct vki_umtx) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_UNLOCK: PRINT( "sys__umtx_op ( %#lx, UNLOCK, %ld)", ARG1, ARG3); @@ -1936,6 +1938,7 @@ PRE_MEM_READ( "_umtx_op_wait(mtx)", ARG1, sizeof(struct vki_umtx) ); if (ARG5) PRE_MEM_READ( "_umtx_op_wait(timespec)", ARG5, sizeof(struct vki_timespec) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_WAKE: PRINT( "sys__umtx_op ( %#lx, WAKE, %ld)", ARG1, ARG3); @@ -1962,6 +1965,7 @@ if (ARG5) PRE_MEM_READ( "_umtx_op_mutex_lock(timespec)", ARG5, sizeof(struct vki_timespec) ); PRE_MEM_WRITE( "_umtx_op_mutex_lock(mutex)", ARG1, sizeof(struct vki_umutex) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_MUTEX_UNLOCK: PRINT( "sys__umtx_op ( %#lx, MUTEX_UNLOCK)", ARG1); @@ -1991,6 +1995,7 @@ PRE_MEM_WRITE( "_umtx_op_cv_wait(mutex)", ARG4, sizeof(struct vki_umutex) ); if (ARG5) PRE_MEM_READ( "_umtx_op_cv_wait(timespec)", ARG5, sizeof(struct vki_timespec) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_CV_SIGNAL: PRINT( "sys__umtx_op ( %#lx, CV_SIGNAL)", ARG1); @@ -2014,6 +2019,7 @@ PRE_MEM_READ( "_umtx_op_wait(uint)", ARG1, sizeof(int) ); if (ARG5) PRE_MEM_READ( "_umtx_op_wait(timespec)", ARG5, sizeof(struct vki_timespec) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_RW_RDLOCK: PRINT( "sys__umtx_op ( %#lx, RW_RDLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5); @@ -2022,6 +2028,7 @@ void *, zero, struct vki_timespec *, timeout); PRE_MEM_READ( "_umtx_op_rw_rdlock(rw)", ARG1, sizeof(struct vki_urwlock) ); PRE_MEM_WRITE( "_umtx_op_rw_rdlock(rw)", ARG1, sizeof(struct vki_urwlock) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_RW_WRLOCK: PRINT( "sys__umtx_op ( %#lx, RW_WRLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5); @@ -2030,6 +2037,7 @@ void *, zero, struct vki_timespec *, timeout); PRE_MEM_READ( "_umtx_op_rw_wrlock(rw)", ARG1, sizeof(struct vki_urwlock) ); PRE_MEM_WRITE( "_umtx_op_rw_wrlock(rw)", ARG1, sizeof(struct vki_urwlock) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_RW_UNLOCK: PRINT( "sys__umtx_op ( %#lx, RW_UNLOCK, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5); @@ -2046,6 +2054,7 @@ PRE_MEM_READ( "_umtx_op_wait_private(uint)", ARG1, sizeof(int) ); if (ARG5) PRE_MEM_READ( "_umtx_op_wait_private(timespec)", ARG5, sizeof(struct vki_timespec) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_WAKE_PRIVATE: PRINT( "sys__umtx_op ( %#lx, CV_WAKE_PRIVATE, %ld)", ARG1, ARG3); @@ -2059,6 +2068,7 @@ struct umutex *, obj, int, op); PRE_MEM_READ( "_umtx_op_mutex_wait(mutex)", ARG1, sizeof(struct vki_umutex) ); PRE_MEM_WRITE( "_umtx_op_mutex_wait(mutex)", ARG1, sizeof(struct vki_umutex) ); + *flags |= SfMayBlock; break; case VKI_UMTX_OP_MUTEX_WAKE: PRINT( "sys__umtx_op ( %#lx, MUTEX_WAKE, %ld, %#lx, %#lx)", ARG1, ARG3, ARG4, ARG5); @@ -2071,10 +2081,13 @@ PRINT( "sys__umtx_op ( %#lx, %ld(UNKNOWN), %ld, %#lx, %#lx )", ARG1, ARG2, ARG3, ARG4, ARG5); break; } +// tst = VG_(get_ThreadState)(tid); +//PRINT(" [[ UMTX_OP: me=%d arg1 %#lx = %#lx (%ld) ]]", tst->os_state.lwpid, ARG1, *(UWord *)ARG1, *(UWord *)ARG1 & 0x7fffffff); } POST(sys__umtx_op) { +//VG_(printf)("[[ POST_UMTX_OP: arg1 %#lx = %#lx (%ld) ]]\n", ARG1, *(UWord *)ARG1, *(UWord *)ARG1 & 0x7fffffff); switch(ARG2) { case VKI_UMTX_OP_LOCK: if (SUCCESS)