/* TEST_BUILD $C{COMPILE} $DIR/concurrentcat.m -o concurrentcat.exe -framework Foundation $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc1 -o cc1.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc2 -o cc2.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc3 -o cc3.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc4 -o cc4.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc5 -o cc5.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc6 -o cc6.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc7 -o cc7.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc8 -o cc8.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc9 -o cc9.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc10 -o cc10.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc11 -o cc11.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc12 -o cc12.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc13 -o cc13.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc14 -o cc14.bundle $C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc15 -o cc15.bundle END */ #include "test.h" #include #include #include #include #include #include @interface TargetClass : NSObject @end @interface TargetClass(LoadedMethods) - (void) m0; - (void) m1; - (void) m2; - (void) m3; - (void) m4; - (void) m5; - (void) m6; - (void) m7; - (void) m8; - (void) m9; - (void) m10; - (void) m11; - (void) m12; - (void) m13; - (void) m14; - (void) m15; @end @implementation TargetClass - (void) m0 { fail("shoulda been loaded!"); } - (void) m1 { fail("shoulda been loaded!"); } - (void) m2 { fail("shoulda been loaded!"); } - (void) m3 { fail("shoulda been loaded!"); } - (void) m4 { fail("shoulda been loaded!"); } - (void) m5 { fail("shoulda been loaded!"); } - (void) m6 { fail("shoulda been loaded!"); } @end void *threadFun(void *aTargetClassName) { const char *className = (const char *)aTargetClassName; PUSH_POOL { Class targetSubclass = objc_getClass(className); testassert(targetSubclass); id target = [targetSubclass new]; testassert(target); while(1) { [target m0]; RETAIN(target); [target addObserver: target forKeyPath: @"m3" options: 0 context: NULL]; [target addObserver: target forKeyPath: @"m4" options: 0 context: NULL]; [target m1]; RELEASE_VALUE(target); [target m2]; AUTORELEASE(target); [target m3]; RETAIN(target); [target removeObserver: target forKeyPath: @"m4"]; [target addObserver: target forKeyPath: @"m5" options: 0 context: NULL]; [target m4]; RETAIN(target); [target m5]; AUTORELEASE(target); [target m6]; [target m7]; [target m8]; [target m9]; [target m10]; [target m11]; [target m12]; [target m13]; [target m14]; [target m15]; [target removeObserver: target forKeyPath: @"m3"]; [target removeObserver: target forKeyPath: @"m5"]; } } POP_POOL; return NULL; } int main() { int i; void *dylib; for(i=1; i<16; i++) { pthread_t t; char dlName[100]; sprintf(dlName, "cc%d.bundle", i); dylib = dlopen(dlName, RTLD_LAZY); char className[100]; sprintf(className, "cc%d", i); pthread_create(&t, NULL, threadFun, strdup(className)); testassert(dylib); } sleep(1); succeed(__FILE__); }