* commit '2d988187712f52773b89421d139b266c8b58f769': Add test about pthread_mutex_t owner tid limit.
This commit is contained in:
		@@ -150,30 +150,9 @@
 | 
				
			|||||||
/* Mutex owner field:
 | 
					/* Mutex owner field:
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This is only used for recursive and errorcheck mutexes. It holds the
 | 
					 * This is only used for recursive and errorcheck mutexes. It holds the
 | 
				
			||||||
 * tid of the owning thread. Note that this works because the Linux
 | 
					 * tid of the owning thread. We use 16 bits to represent tid here,
 | 
				
			||||||
 * kernel _only_ uses 16-bit values for tids.
 | 
					 * so the highest tid is 65535. There is a test to check /proc/sys/kernel/pid_max
 | 
				
			||||||
 *
 | 
					 * to make sure it will not exceed our limit.
 | 
				
			||||||
 * More specifically, it will wrap to 10000 when it reaches over 32768 for
 | 
					 | 
				
			||||||
 * application processes. You can check this by running the following inside
 | 
					 | 
				
			||||||
 * an adb shell session:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
    OLDPID=$$;
 | 
					 | 
				
			||||||
    while true; do
 | 
					 | 
				
			||||||
    NEWPID=$(sh -c 'echo $$')
 | 
					 | 
				
			||||||
    if [ "$NEWPID" -gt 32768 ]; then
 | 
					 | 
				
			||||||
        echo "AARGH: new PID $NEWPID is too high!"
 | 
					 | 
				
			||||||
        exit 1
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ "$NEWPID" -lt "$OLDPID" ]; then
 | 
					 | 
				
			||||||
        echo "****** Wrapping from PID $OLDPID to $NEWPID. *******"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        echo -n "$NEWPID!"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    OLDPID=$NEWPID
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 * Note that you can run the same example on a desktop Linux system,
 | 
					 | 
				
			||||||
 * the wrapping will also happen at 32768, but will go back to 300 instead.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define  MUTEX_OWNER_SHIFT     16
 | 
					#define  MUTEX_OWNER_SHIFT     16
 | 
				
			||||||
#define  MUTEX_OWNER_LEN       16
 | 
					#define  MUTEX_OWNER_LEN       16
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,7 @@
 | 
				
			|||||||
#include <malloc.h>
 | 
					#include <malloc.h>
 | 
				
			||||||
#include <pthread.h>
 | 
					#include <pthread.h>
 | 
				
			||||||
#include <signal.h>
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <sys/mman.h>
 | 
					#include <sys/mman.h>
 | 
				
			||||||
#include <sys/syscall.h>
 | 
					#include <sys/syscall.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
@@ -1092,3 +1093,14 @@ TEST(pthread, pthread_mutex_lock_RECURSIVE) {
 | 
				
			|||||||
  ASSERT_EQ(EPERM, pthread_mutex_unlock(&lock));
 | 
					  ASSERT_EQ(EPERM, pthread_mutex_unlock(&lock));
 | 
				
			||||||
  ASSERT_EQ(0, pthread_mutex_destroy(&lock));
 | 
					  ASSERT_EQ(0, pthread_mutex_destroy(&lock));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(pthread, pthread_mutex_owner_tid_limit) {
 | 
				
			||||||
 | 
					  FILE* fp = fopen("/proc/sys/kernel/pid_max", "r");
 | 
				
			||||||
 | 
					  ASSERT_TRUE(fp != NULL);
 | 
				
			||||||
 | 
					  long pid_max;
 | 
				
			||||||
 | 
					  ASSERT_EQ(1, fscanf(fp, "%ld", &pid_max));
 | 
				
			||||||
 | 
					  fclose(fp);
 | 
				
			||||||
 | 
					  // Current pthread_mutex uses 16 bits to represent owner tid.
 | 
				
			||||||
 | 
					  // Change the implementation if we need to support higher value than 65535.
 | 
				
			||||||
 | 
					  ASSERT_LE(pid_max, 65536);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user