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