1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <pthread.h>
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h>
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h>
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_cond_t cond1;
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_cond_t cond2;
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_mutex_t test_lock = PTHREAD_MUTEX_INITIALIZER;
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void *
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread1_func(void* arg)
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 1 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid());
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("1 waiting for cond1\n");
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_lock(&test_lock);
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_wait(&cond1, &test_lock );
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_unlock(&test_lock);
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 1 done.\n");
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void *
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread2_func(void* arg)
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 2 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid());
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("2 waiting for cond2\n");
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_lock(&test_lock);
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_wait(&cond2, &test_lock );
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_unlock(&test_lock);
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 2 done.\n");
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void *
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread3_func(void* arg)
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 3 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid());
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("3 waiting for cond1\n");
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_lock(&test_lock);
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_wait(&cond1, &test_lock );
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_unlock(&test_lock);
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("3 Sleeping\n");
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    sleep(2);
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("3 signal cond2\n");
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_signal(&cond2);
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 3 done.\n");
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void *
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread4_func(void* arg)
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 4 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid());
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("4 Sleeping\n");
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    sleep(5);
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("4 broadcast cond1\n");
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_broadcast(&cond1);
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("Thread 4 done.\n");
64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, const char *argv[])
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_t t[4];
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_init(&cond1, NULL);
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_init(&cond2, NULL);
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_create( &t[0], NULL, thread1_func, (void *)1 );
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_create( &t[1], NULL, thread2_func, (void *)2 );
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_create( &t[2], NULL, thread3_func, (void *)3 );
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_create( &t[3], NULL, thread4_func, (void *)4 );
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_join(t[0], NULL);
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_join(t[1], NULL);
80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_join(t[2], NULL);
81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_join(t[3], NULL);
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
84