Date: Wed, 12 Nov 2008 01:14:51 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 152839 for review Message-ID: <200811120114.mAC1Eprw010348@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811120114.mAC1Eprw010348>