test_cond.c revision e16cb84e2324f05334d18dcf5956f20f44262b62
1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * All rights reserved.
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * modification, are permitted provided that the following conditions
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * are met:
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *  * Redistributions of source code must retain the above copyright
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *    notice, this list of conditions and the following disclaimer in
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *    the documentation and/or other materials provided with the
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *    distribution.
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * SUCH DAMAGE.
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <pthread.h>
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <semaphore.h>
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <errno.h>
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h>
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <string.h>
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_mutex_t lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_cond_t  wait = PTHREAD_COND_INITIALIZER;
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void* _thread1(void *__u __attribute__((unused)))
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("1: obtaining mutex\n");
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_lock(&lock);
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("1: waiting on condition variable\n");
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_cond_wait(&wait, &lock);
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("1: releasing mutex\n");
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_mutex_unlock(&lock);
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("1: exiting\n");
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return NULL;
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void* _thread2(void *__u __attribute__((unused)))
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int cnt = 2;
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    while(cnt--) {
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("2: obtaining mutex\n");
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        pthread_mutex_lock(&lock);
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("2: signaling\n");
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        pthread_cond_signal(&wait);
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("2: releasing mutex\n");
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        pthread_mutex_unlock(&lock);
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    printf("2: exiting\n");
64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return NULL;
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef void* (*thread_func)(void*);
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic const  thread_func thread_routines[] =
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    &_thread1,
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    &_thread2,
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(void)
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pthread_t t[2];
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int nn;
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int count = (int)(sizeof t/sizeof t[0]);
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (nn = 0; nn < count; nn++) {
81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("main: creating thread %d\n", nn+1);
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if (pthread_create( &t[nn], NULL, thread_routines[nn], NULL) < 0) {
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            printf("main: could not create thread %d: %s\n", nn+1, strerror(errno));
84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            return -2;
85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (nn = 0; nn < count; nn++) {
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        printf("main: joining thread %d\n", nn+1);
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        if (pthread_join(t[nn], NULL)) {
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            printf("main: could not join thread %d: %s\n", nn+1, strerror(errno));
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            return -2;
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        }
94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
98