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 <stdio.h> 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define MAGIC1 0xcafebabeU 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define MAGIC2 0x8badf00dU 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define MAGIC3 0x12345667U 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int g_ok1 = 0; 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int g_ok2 = 0; 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int g_ok3 = 0; 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectcleanup1( void* arg ) 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ((unsigned)arg != MAGIC1) 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project g_ok1 = -1; 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project g_ok1 = +1; 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectcleanup2( void* arg ) 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ((unsigned)arg != MAGIC2) { 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project g_ok2 = -1; 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project g_ok2 = +1; 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectcleanup3( void* arg ) 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ((unsigned)arg != MAGIC3) 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project g_ok3 = -1; 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project g_ok3 = +1; 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void* 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread1_func( void* arg ) 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cleanup_push( cleanup1, (void*)MAGIC1 ); 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cleanup_push( cleanup2, (void*)MAGIC2 ); 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cleanup_push( cleanup3, (void*)MAGIC3 ); 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (arg != NULL) 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_exit(0); 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cleanup_pop(0); 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cleanup_pop(1); 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cleanup_pop(1); 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return NULL; 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int test( int do_exit ) 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_t t; 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_create( &t, NULL, thread1_func, (void*)do_exit ); 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_join( t, NULL ); 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (g_ok1 != +1) { 94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (g_ok1 == 0) { 95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup1 not called !!\n"); 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup1 called with wrong argument\n" ); 98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(1); 100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (g_ok2 != +1) { 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (g_ok2 == 0) 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup2 not called !!\n"); 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup2 called with wrong argument\n"); 106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(2); 107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (do_exit && g_ok3 != +1) { 109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (g_ok3 == 0) { 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup3 not called !!\n"); 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup3 called with bad argument !!\n"); 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(3); 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!do_exit && g_ok3 != 0) { 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (g_ok3 == 1) { 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup3 wrongly called !!\n"); 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "cleanup3 wrongly called with bad argument !!\n"); 121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(3); 123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main( void ) 129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project test(0); 131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project test(1); 132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("OK\n"); 133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 135