the test now works as expected on Linux, and not on Haiku, it was broken before.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40644 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
|
|
||||||
static pthread_attr_t attributes;
|
static pthread_attr_t attributes;
|
||||||
|
static int id[4] = {0, 1, 2, 3};
|
||||||
static pthread_t tid[4];
|
static pthread_t tid[4];
|
||||||
static bool state[4];
|
static bool state[4];
|
||||||
static bool blocking[4];
|
static bool blocking[4];
|
||||||
@@ -85,18 +86,20 @@ self_suspend(int* i)
|
|||||||
void *
|
void *
|
||||||
threadStart(void *arg)
|
threadStart(void *arg)
|
||||||
{
|
{
|
||||||
int *i = (int*)arg;
|
int i = *(int*)arg;
|
||||||
pthread_setspecific(self, i);
|
pthread_setspecific(self, &i);
|
||||||
|
|
||||||
state[*i] = true;
|
state[i] = true;
|
||||||
blocking[*i] = true;
|
blocking[i] = true;
|
||||||
|
|
||||||
|
printf("threadStart(%d)\n", i);
|
||||||
|
|
||||||
for (int j = 0; j < 10; j++) {
|
for (int j = 0; j < 10; j++) {
|
||||||
self_suspend(i);
|
usleep(1000000);
|
||||||
usleep(10000);
|
self_suspend(&i);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("quitting %d\n", *i);
|
printf("quitting %d\n", i);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,8 +133,9 @@ resumeAllThreads()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int t = 50;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
while(state[i] == false) {
|
while(state[i] == false && t-- > 0) {
|
||||||
printf("thread %d still suspended, yielding\n", i);
|
printf("thread %d still suspended, yielding\n", i);
|
||||||
sched_yield();
|
sched_yield();
|
||||||
}
|
}
|
||||||
@@ -150,14 +154,14 @@ main(int argc, char **argv)
|
|||||||
pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_DETACHED);
|
pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_DETACHED);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
if (pthread_create(&tid[i], &attributes, threadStart, &i) != 0)
|
if (pthread_create(&tid[i], &attributes, threadStart, &id[i]) != 0)
|
||||||
fprintf(stderr, "couldn't create thread %d\n", i);
|
fprintf(stderr, "couldn't create thread %d\n", i);
|
||||||
printf("thread %d created\n", i);
|
printf("thread %d created\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*suspendAllThreads();*/
|
/*suspendAllThreads();*/
|
||||||
printf("snoozing\n");
|
printf("snoozing\n");
|
||||||
usleep(2000000);
|
usleep(3000000);
|
||||||
printf("resuming all threads\n");
|
printf("resuming all threads\n");
|
||||||
resumeAllThreads();
|
resumeAllThreads();
|
||||||
printf("resuming all threads done\n");
|
printf("resuming all threads done\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user