* commit '2d988187712f52773b89421d139b266c8b58f769': Add test about pthread_mutex_t owner tid limit.
This commit is contained in:
commit
70ad54d8c0
@ -150,30 +150,9 @@
|
||||
/* Mutex owner field:
|
||||
*
|
||||
* This is only used for recursive and errorcheck mutexes. It holds the
|
||||
* tid of the owning thread. Note that this works because the Linux
|
||||
* kernel _only_ uses 16-bit values for tids.
|
||||
*
|
||||
* 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.
|
||||
* tid of the owning thread. We use 16 bits to represent tid here,
|
||||
* 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.
|
||||
*/
|
||||
#define MUTEX_OWNER_SHIFT 16
|
||||
#define MUTEX_OWNER_LEN 16
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <malloc.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <time.h>
|
||||
@ -1092,3 +1093,14 @@ TEST(pthread, pthread_mutex_lock_RECURSIVE) {
|
||||
ASSERT_EQ(EPERM, pthread_mutex_unlock(&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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user