]> git.saurik.com Git - apple/objc4.git/blob - test/concurrentcat.m
objc4-437.tar.gz
[apple/objc4.git] / test / concurrentcat.m
1 #include "test.h"
2 #include <objc/runtime.h>
3 #include <dlfcn.h>
4 #include <unistd.h>
5 #include <pthread.h>
6 #include <Foundation/Foundation.h>
7
8 @interface TargetClass : NSObject
9 @end
10
11 @interface TargetClass(LoadedMethods)
12 - (void) m0;
13 - (void) m1;
14 - (void) m2;
15 - (void) m3;
16 - (void) m4;
17 - (void) m5;
18 - (void) m6;
19 - (void) m7;
20 - (void) m8;
21 - (void) m9;
22 - (void) m10;
23 - (void) m11;
24 - (void) m12;
25 - (void) m13;
26 - (void) m14;
27 - (void) m15;
28 @end
29
30 @implementation TargetClass
31 +(void)initialize { }
32 +(id)new {
33 return class_createInstance(self, 0);
34 }
35 - (void) m0; { fail("shoulda been loaded!"); }
36 - (void) m1; { fail("shoulda been loaded!"); }
37 - (void) m2; { fail("shoulda been loaded!"); }
38 - (void) m3; { fail("shoulda been loaded!"); }
39 - (void) m4; { fail("shoulda been loaded!"); }
40 - (void) m5; { fail("shoulda been loaded!"); }
41 - (void) m6; { fail("shoulda been loaded!"); }
42 @end
43
44 void *threadFun(void *aTargetClassName) {
45 const char *className = aTargetClassName;
46
47 objc_registerThreadWithCollector();
48
49 NSAutoreleasePool *p = [NSAutoreleasePool new];
50
51 Class targetSubclass = objc_getClass(className);
52 testassert(targetSubclass);
53
54 id target = [targetSubclass new];
55 testassert(target);
56
57 while(1) {
58 [target m0];
59 [target retain];
60 [target addObserver: target forKeyPath: @"m3" options: 0 context: NULL];
61 [target addObserver: target forKeyPath: @"m4" options: 0 context: NULL];
62 [target m1];
63 [target release];
64 [target m2];
65 [target autorelease];
66 [target m3];
67 [target retain];
68 [target removeObserver: target forKeyPath: @"m4"];
69 [target addObserver: target forKeyPath: @"m5" options: 0 context: NULL];
70 [target m4];
71 [target retain];
72 [target m5];
73 [target autorelease];
74 [target m6];
75 [target m7];
76 [target m8];
77 [target m9];
78 [target m10];
79 [target m11];
80 [target m12];
81 [target m13];
82 [target m14];
83 [target m15];
84 [target removeObserver: target forKeyPath: @"m3"];
85 [target removeObserver: target forKeyPath: @"m5"];
86 }
87 [p drain];
88 return NULL;
89 }
90
91 int main()
92 {
93 int i;
94
95 void *dylib;
96
97 for(i=1; i<16; i++) {
98 pthread_t t;
99 char dlName[100];
100 sprintf(dlName, "cc%d.out", i);
101 dylib = dlopen(dlName, RTLD_LAZY);
102 char className[100];
103 sprintf(className, "cc%d", i);
104 pthread_create(&t, NULL, threadFun, strdup(className));
105 testassert(dylib);
106 }
107 sleep(1);
108
109 succeed(__FILE__);
110 }