Commit 12e3d7c4 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

zdtm: pthread00 -- Use task waiters instead of mmap+sleep pair

Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Acked-by: 's avatarAndrew Vagin <avagin@parallels.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 8ee07313
......@@ -24,22 +24,28 @@ const char *test_author = "Cyrill Gorcunov <gorcunov@openvz.org";
static __thread char tls_data[10];
#define TRANSITION_CREATED 1
#define TRANSITION_STARTED 2
#define TRANSITION_PASSED 4
#define TRANSITION_FAILED 8
#define MAP(map, i) (((int *)map)[i])
#define SET_CREATED(map, i) MAP(map, i) |= TRANSITION_CREATED
#define SET_STARTED(map, i) MAP(map, i) |= TRANSITION_STARTED
#define SET_PASSED(map, i) MAP(map, i) |= TRANSITION_PASSED
#define SET_FAILED(map, i) MAP(map, i) |= TRANSITION_FAILED
#define SET_PASSED(map, i) MAP(map, i) = TRANSITION_PASSED
#define SET_FAILED(map, i) MAP(map, i) = TRANSITION_FAILED
#define IS_CREATED(map, i) (MAP(map, i) & TRANSITION_CREATED)
#define IS_STARTED(map, i) (MAP(map, i) & TRANSITION_STARTED)
#define IS_PASSED(map, i) (MAP(map, i) & TRANSITION_PASSED)
#define IS_FAILED(map, i) (MAP(map, i) & TRANSITION_FAILED)
#define NR_WAITERS 6
static task_waiter_t waiter[NR_WAITERS];
#define passage(index) \
do { \
task_waiter_complete(&waiter[index], 1); \
task_waiter_wait4(&waiter[index], 2); \
if (memcmp(tls_data, __tls_data, sizeof(tls_data))) \
SET_FAILED(map, index); \
else \
SET_PASSED(map, index); \
} while (0)
static void *thread_subfunc_1(void *map)
{
......@@ -53,41 +59,11 @@ static void *thread_subfunc_1(void *map)
if (pid < 0) {
exit(1);
} else if (pid == 0) {
SET_CREATED(map, 4);
while (1) {
int ret = 0;
if (memcmp(tls_data, __tls_data, sizeof(tls_data)))
ret = 1;
if (ret) {
if (IS_STARTED(map, 4)) {
SET_FAILED(map, 4);
exit(0);
}
} else {
if (IS_STARTED(map, 4)) {
SET_PASSED(map, 4);
exit(0);
}
}
sleep(1);
}
passage(0);
exit(0);
}
SET_CREATED(map, 5);
while (1) {
int ret = 0;
if (memcmp(tls_data, __tls_data, sizeof(tls_data)))
ret = 1;
if (ret) {
if (IS_STARTED(map, 5))
SET_FAILED(map, 5);
} else {
SET_PASSED(map, 5);
}
if (IS_STARTED(map, 5))
break;
sleep(1);
}
passage(1);
test_msg("Waiting for %d\n", pid);
waitpid(pid, &status, 0);
......@@ -112,41 +88,11 @@ static void *thread_func_1(void *map)
fail("Failed to test_fork()\n");
exit(1);
} else if (pid == 0) {
SET_CREATED(map, 2);
while (1) {
int ret = 0;
if (memcmp(tls_data, __tls_data, sizeof(tls_data)))
ret = 1;
if (ret) {
if (IS_STARTED(map, 2)) {
SET_FAILED(map, 2);
exit(0);
}
} else {
if (IS_STARTED(map, 2)) {
SET_PASSED(map, 2);
exit(0);
}
}
sleep(1);
}
passage(2);
exit(0);
}
SET_CREATED(map, 3);
while (1) {
int ret = 0;
if (memcmp(tls_data, __tls_data, sizeof(tls_data)))
ret = 1;
if (ret) {
if (IS_STARTED(map, 3))
SET_FAILED(map, 3);
} else {
SET_PASSED(map, 3);
}
if (IS_STARTED(map, 3))
break;
sleep(1);
}
passage(3);
pthread_join(th, NULL);
test_msg("Waiting for %d\n", pid);
......@@ -168,41 +114,11 @@ static void *thread_func_2(void *map)
fail("Failed to test_fork()\n");
exit(1);
} else if (pid == 0) {
SET_CREATED(map, 0);
while (1) {
int ret = 0;
if (memcmp(tls_data, __tls_data, sizeof(tls_data)))
ret = 1;
if (ret) {
if (IS_STARTED(map, 0)) {
SET_FAILED(map, 0);
exit(0);
}
} else {
if (IS_STARTED(map, 0)) {
SET_PASSED(map, 0);
exit(0);
}
}
sleep(1);
}
passage(4);
exit(0);
}
SET_CREATED(map, 1);
while (1) {
int ret = 0;
if (memcmp(tls_data, __tls_data, sizeof(tls_data)))
ret = 1;
if (ret) {
if (IS_STARTED(map, 1))
SET_FAILED(map, 1);
} else {
SET_PASSED(map, 1);
}
if (IS_STARTED(map, 1))
break;
sleep(1);
}
passage(5);
test_msg("Waiting for %d\n", pid);
waitpid(pid, &status, 0);
......@@ -213,11 +129,14 @@ static void *thread_func_2(void *map)
int main(int argc, char *argv[])
{
pthread_t th1, th2;
int rc1, rc2;
int rc1, rc2, i;
void *map;
test_init(argc, argv);
for (i = 0; i < NR_WAITERS; i++)
task_waiter_init(&waiter[i]);
test_msg("%s pid %d\n", argv[0], getpid());
map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (map == MAP_FAILED) {
......@@ -233,28 +152,17 @@ int main(int argc, char *argv[])
exit(1);
}
test_msg("Waiting until all threads are created\n");
for (;;) {
if (IS_CREATED(map, 0) &&
IS_CREATED(map, 1) &&
IS_CREATED(map, 2) &&
IS_CREATED(map, 3) &&
IS_CREATED(map, 4) &&
IS_CREATED(map, 5))
break;
sleep(1);
}
test_msg("Waiting until all threads are ready\n");
SET_STARTED(map, 0);
SET_STARTED(map, 1);
SET_STARTED(map, 2);
SET_STARTED(map, 3);
SET_STARTED(map, 4);
SET_STARTED(map, 5);
for (i = NR_WAITERS - 1; i >= 0; i--)
task_waiter_wait4(&waiter[i], 1);
test_daemon();
test_waitsig();
for (i = 0; i < NR_WAITERS; i++)
task_waiter_complete(&waiter[i], 2);
test_msg("Waiting while all threads are joined\n");
pthread_join(th1, NULL);
pthread_join(th2, NULL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment