PERFORCE change 152839 for review

Peter Wemm peter at FreeBSD.org
Tue Nov 11 17:14:52 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=152839

Change 152839 by peter at 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)


More information about the p4-projects mailing list