Skip site navigation (1)Skip section navigation (2)
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>