1/* 2 * Helper methods opaque-pointer tests (objc.test.test_opaque) 3 */ 4#include "Python.h" 5#include "pyobjc-api.h" 6#include <stdarg.h> 7 8#import <Foundation/Foundation.h> 9 10typedef struct _Foo* FooHandle; 11typedef struct _Bar* BarHandle; 12 13@interface NSObject (OC_LockingTest) 14-(void)setLocked:(NSObject*)value; 15-(NSObject*)isLocked; 16-(void)appendToList:(NSObject*)value; 17@end 18 19@interface OC_LockTest : NSObject 20-(void)threadFunc:(NSObject*)object; 21@end 22 23@implementation OC_LockTest 24-(void)threadFunc:(NSObject*)object 25{ 26 int i; 27 for (i = 0; i < 6; i++) { 28 usleep(500000); 29 @synchronized(object) { 30 NSNumber* isLocked = (NSNumber*)[object isLocked]; 31 if ([isLocked boolValue]) { 32 [object appendToList:@"LOCK FOUND"]; 33 } 34 [object setLocked:[NSNumber numberWithBool:YES]]; 35 [object appendToList:@"threading a"]; 36 usleep(5000000); 37 [object appendToList:@"threading b"]; 38 [object setLocked:[NSNumber numberWithBool:NO]]; 39 } 40 } 41} 42@end 43 44 45static PyMethodDef mod_methods[] = { 46 { 0, 0, 0, 0 } 47}; 48 49#if PY_VERSION_HEX >= 0x03000000 50 51static struct PyModuleDef mod_module = { 52 PyModuleDef_HEAD_INIT, 53 "locking", 54 NULL, 55 0, 56 mod_methods, 57 NULL, 58 NULL, 59 NULL, 60 NULL 61}; 62 63#define INITERROR() return NULL 64#define INITDONE() return m 65 66PyObject* PyInit_locking(void); 67 68PyObject* 69PyInit_locking(void) 70 71#else 72 73#define INITERROR() return 74#define INITDONE() return 75 76void initlocking(void); 77 78void 79initlocking(void) 80#endif 81{ 82 PyObject* m; 83 84#if PY_VERSION_HEX >= 0x03000000 85 m = PyModule_Create(&mod_module); 86#else 87 m = Py_InitModule4("locking", mod_methods, 88 NULL, NULL, PYTHON_API_VERSION); 89#endif 90 if (!m) { 91 INITERROR(); 92 } 93 94 if (PyObjC_ImportAPI(m) < 0) { 95 INITERROR(); 96 } 97 98 if (PyModule_AddObject(m, "OC_LockTest", 99 PyObjCClass_New([OC_LockTest class])) < 0) { 100 INITERROR(); 101 } 102 103 INITDONE(); 104} 105