]>
Commit | Line | Data |
---|---|---|
bac542e6 A |
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 | ||
36 | static 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 | ||
60 | int 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 | } |