mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-23 04:54:01 +08:00
liblockdep: Add pthread_mutex_t test suite
This is a rather simple and basic test suite to test common locking issues. Beyond tests, it also shows how to use the library. Signed-off-by: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Cc: torvalds@linux-foundation.org Link: http://lkml.kernel.org/r/1371163284-6346-5-git-send-email-sasha.levin@oracle.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
45e6207464
commit
878f968eeb
27
tools/lib/lockdep/run_tests.sh
Normal file
27
tools/lib/lockdep/run_tests.sh
Normal file
@ -0,0 +1,27 @@
|
||||
#! /bin/bash
|
||||
|
||||
make &> /dev/null
|
||||
|
||||
for i in `ls tests/*.c`; do
|
||||
testname=$(basename -s .c "$i")
|
||||
gcc -o tests/$testname -pthread -lpthread $i liblockdep.a -Iinclude -D__USE_LIBLOCKDEP &> /dev/null
|
||||
echo -ne "$testname... "
|
||||
if [ $(timeout 1 ./tests/$testname | wc -l) -gt 0 ]; then
|
||||
echo "PASSED!"
|
||||
else
|
||||
echo "FAILED!"
|
||||
fi
|
||||
rm tests/$testname
|
||||
done
|
||||
|
||||
for i in `ls tests/*.c`; do
|
||||
testname=$(basename -s .c "$i")
|
||||
gcc -o tests/$testname -pthread -lpthread -Iinclude $i &> /dev/null
|
||||
echo -ne "(PRELOAD) $testname... "
|
||||
if [ $(timeout 1 ./lockdep ./tests/$testname | wc -l) -gt 0 ]; then
|
||||
echo "PASSED!"
|
||||
else
|
||||
echo "FAILED!"
|
||||
fi
|
||||
rm tests/$testname
|
||||
done
|
13
tools/lib/lockdep/tests/AA.c
Normal file
13
tools/lib/lockdep/tests/AA.c
Normal file
@ -0,0 +1,13 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
|
||||
pthread_mutex_lock(&a);
|
||||
pthread_mutex_lock(&b);
|
||||
pthread_mutex_lock(&a);
|
||||
}
|
13
tools/lib/lockdep/tests/ABBA.c
Normal file
13
tools/lib/lockdep/tests/ABBA.c
Normal file
@ -0,0 +1,13 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
#include "common.h"
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
|
||||
LOCK_UNLOCK_2(a, b);
|
||||
LOCK_UNLOCK_2(b, a);
|
||||
}
|
15
tools/lib/lockdep/tests/ABBCCA.c
Normal file
15
tools/lib/lockdep/tests/ABBCCA.c
Normal file
@ -0,0 +1,15 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
#include "common.h"
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b, c;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
pthread_mutex_init(&c, NULL);
|
||||
|
||||
LOCK_UNLOCK_2(a, b);
|
||||
LOCK_UNLOCK_2(b, c);
|
||||
LOCK_UNLOCK_2(c, a);
|
||||
}
|
17
tools/lib/lockdep/tests/ABBCCDDA.c
Normal file
17
tools/lib/lockdep/tests/ABBCCDDA.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
#include "common.h"
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b, c, d;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
pthread_mutex_init(&c, NULL);
|
||||
pthread_mutex_init(&d, NULL);
|
||||
|
||||
LOCK_UNLOCK_2(a, b);
|
||||
LOCK_UNLOCK_2(b, c);
|
||||
LOCK_UNLOCK_2(c, d);
|
||||
LOCK_UNLOCK_2(d, a);
|
||||
}
|
15
tools/lib/lockdep/tests/ABCABC.c
Normal file
15
tools/lib/lockdep/tests/ABCABC.c
Normal file
@ -0,0 +1,15 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
#include "common.h"
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b, c;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
pthread_mutex_init(&c, NULL);
|
||||
|
||||
LOCK_UNLOCK_2(a, b);
|
||||
LOCK_UNLOCK_2(c, a);
|
||||
LOCK_UNLOCK_2(b, c);
|
||||
}
|
17
tools/lib/lockdep/tests/ABCDBCDA.c
Normal file
17
tools/lib/lockdep/tests/ABCDBCDA.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
#include "common.h"
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b, c, d;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
pthread_mutex_init(&c, NULL);
|
||||
pthread_mutex_init(&d, NULL);
|
||||
|
||||
LOCK_UNLOCK_2(a, b);
|
||||
LOCK_UNLOCK_2(c, d);
|
||||
LOCK_UNLOCK_2(b, c);
|
||||
LOCK_UNLOCK_2(d, a);
|
||||
}
|
17
tools/lib/lockdep/tests/ABCDBDDA.c
Normal file
17
tools/lib/lockdep/tests/ABCDBDDA.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
#include "common.h"
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a, b, c, d;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
pthread_mutex_init(&b, NULL);
|
||||
pthread_mutex_init(&c, NULL);
|
||||
pthread_mutex_init(&d, NULL);
|
||||
|
||||
LOCK_UNLOCK_2(a, b);
|
||||
LOCK_UNLOCK_2(c, d);
|
||||
LOCK_UNLOCK_2(b, d);
|
||||
LOCK_UNLOCK_2(d, a);
|
||||
}
|
12
tools/lib/lockdep/tests/common.h
Normal file
12
tools/lib/lockdep/tests/common.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef _LIBLOCKDEP_TEST_COMMON_H
|
||||
#define _LIBLOCKDEP_TEST_COMMON_H
|
||||
|
||||
#define LOCK_UNLOCK_2(a, b) \
|
||||
do { \
|
||||
pthread_mutex_lock(&(a)); \
|
||||
pthread_mutex_lock(&(b)); \
|
||||
pthread_mutex_unlock(&(b)); \
|
||||
pthread_mutex_unlock(&(a)); \
|
||||
} while(0)
|
||||
|
||||
#endif
|
12
tools/lib/lockdep/tests/unlock_balance.c
Normal file
12
tools/lib/lockdep/tests/unlock_balance.c
Normal file
@ -0,0 +1,12 @@
|
||||
#include <liblockdep/mutex.h>
|
||||
|
||||
void main(void)
|
||||
{
|
||||
pthread_mutex_t a;
|
||||
|
||||
pthread_mutex_init(&a, NULL);
|
||||
|
||||
pthread_mutex_lock(&a);
|
||||
pthread_mutex_unlock(&a);
|
||||
pthread_mutex_unlock(&a);
|
||||
}
|
Loading…
Reference in New Issue
Block a user