1/* 2 * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23#include <stdio.h> // fprintf(), NULL 24#include <stdlib.h> // exit(), EXIT_SUCCESS 25#include <string.h> 26#include <dlfcn.h> 27#include <pthread.h> 28 29#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL() 30 31 32/// 33/// This tests that the dlerror message is kept per thread 34/// 35 36static void* work(void* arg) 37{ 38 const char* str = (char*)arg; 39 for(int i=0; i < 1000; ++i) { 40 //fprintf(stderr, "dlopen(%s)\n", str); 41 void* handle = dlopen(str, RTLD_LAZY); 42 if ( handle != NULL ) { 43 FAIL("dlopen(%s) unexpectedly succeeded", str); 44 exit(0); 45 } 46 char* msg = dlerror(); 47 //fprintf(stderr, "dlopen(%s) => %s\n", str, msg); 48 if ( (msg == NULL) || (strstr(msg, str) == NULL) ) { 49 FAIL("dlerror() did not contain library name that could not be loaded", str); 50 exit(0); 51 } 52 53 54 } 55 return 0; 56} 57 58 59 60int main() 61{ 62 dlsym(RTLD_DEFAULT, "foobar"); 63 //fprintf(stderr, "%s\n", dlerror()); 64 65 pthread_t worker1; 66 if ( pthread_create(&worker1, NULL, work, "/frazzle/bar") != 0 ) { 67 FAIL("pthread_create failed"); 68 exit(0); 69 } 70 71 pthread_t worker2; 72 if ( pthread_create(&worker2, NULL, work, "/frazzle/foo") != 0 ) { 73 FAIL("pthread_create failed"); 74 exit(0); 75 } 76 77 pthread_t worker3; 78 if ( pthread_create(&worker3, NULL, work, "/frazzle/dazzle") != 0 ) { 79 FAIL("pthread_create failed"); 80 exit(0); 81 } 82 83 void* result; 84 //fprintf(stderr, "waiting for worker 1\n"); 85 pthread_join(worker1, &result); 86 //fprintf(stderr, "waiting for worker 2\n"); 87 pthread_join(worker2, &result); 88 //fprintf(stderr, "waiting for worker 3\n"); 89 pthread_join(worker3, &result); 90 91 PASS("dlerror-thread-test"); 92 return 0; 93} 94