7 #include "Raym/Log.h"
\r
8 #define RAYM_MEMORY_CHECK
\r
9 //#define RAYM_MUTEX_CHECK
\r
12 #include <windows.h>
\r
14 #include <pthread.h>
\r
17 #include <Raym/Runtime.h>
\r
19 #define SET_METHOD(P1, P2) \
\r
30 #define RELEASE(P1) \
\r
37 #define isKindOfClass(CLS, OBJ) \
\r
38 (strcmp(#CLS, (OBJ)->className()) == 0)
\r
43 #define RAYM_LOCK_CREATE InitializeCriticalSection(&_cs)
\r
44 #define RAYM_LOCK_DESTROY DeleteCriticalSection(&_cs)
\r
45 #define RAYM_COND_CREATE InitializeConditionVariable(&_cond)
\r
46 #define RAYM_COND_DESTROY pthread_cond_destroy(&_cond)
\r
48 #define DEFINE_STATIC_MUTEX(variable) \
\r
49 class STATIC_MUTEX_variable \
\r
52 CRITICAL_SECTION _cs; \
\r
55 STATIC_MUTEX_variable() \
\r
57 InitializeCriticalSection(&_cs); \
\r
59 ~STATIC_MUTEX_variable() \
\r
61 DeleteCriticalSection(&_cs); \
\r
65 EnterCriticalSection(&_cs); \
\r
69 LeaveCriticalSection(&_cs); \
\r
72 static STATIC_MUTEX_variable variable;
\r
76 #define RAYM_LOCK_CREATE { \
\r
77 pthread_mutexattr_t attr; \
\r
78 pthread_mutexattr_init(&attr); \
\r
79 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
\r
80 pthread_mutex_init(&_lock, &attr); \
\r
82 #define RAYM_LOCK_DESTROY pthread_mutex_destroy(&_lock)
\r
83 #define RAYM_COND_CREATE pthread_cond_init(&_cond, NULL)
\r
84 #define RAYM_COND_DESTROY pthread_cond_destroy(&_cond)
\r
86 #define DEFINE_STATIC_MUTEX(variable) \
\r
87 class STATIC_MUTEX_variable \
\r
90 pthread_mutex_t _lock; \
\r
93 STATIC_MUTEX_variable() \
\r
95 pthread_mutexattr_t attr; \
\r
96 pthread_mutexattr_init(&attr); \
\r
97 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
\r
98 pthread_mutex_init(&_lock, &attr); \
\r
100 ~STATIC_MUTEX_variable() \
\r
102 pthread_mutex_destroy(&_lock); \
\r
106 pthread_mutex_lock(&_lock); \
\r
110 pthread_mutex_unlock(&_lock); \
\r
113 static STATIC_MUTEX_variable variable;
\r
119 #ifdef RAYM_MEMORY_CHECK
\r
120 extern int global_raym_count_;
\r
121 extern int global_raym_init_count_;
\r
122 extern int global_raym_retain_count_;
\r
123 extern int global_raym_autorelease_count_;
\r
124 extern int global_raym_release_count_;
\r
127 typedef unsigned int uint;
\r
128 typedef unsigned char uchar;
\r
140 #ifdef RAYM_MUTEX_CHECK
\r
144 CRITICAL_SECTION _cs;
\r
145 CONDITION_VARIABLE _cond;
\r
147 pthread_mutex_t _lock;
\r
148 pthread_cond_t _cond;
\r
153 static Object *alloc();
\r
158 Object *autorelease();
\r
159 Object *autorelease(bool rootPool);
\r
162 virtual String *description();
\r
164 // virtual const char *className() = 0;
\r
165 virtual const char *className();
\r
167 friend void RaymLock(Object *);
\r
168 friend void RaymUnlock(Object *);
\r
169 friend void RaymCondWait(Object *);
\r
170 friend void RaymCondSignal(Object *);
\r
171 friend void RaymCondBroadcast(Object *);
\r
174 #ifndef RAYM_MUTEX_CHECK
\r
175 inline void RaymLock(Object *obj)
\r
178 EnterCriticalSection(&(obj->_cs));
\r
184 #define RaymLock(obj) \
\r
185 DebugLog3("before lock: %s %d", __FILE__, __LINE__); \
\r
186 EnterCriticalSection(&(obj->_cs)); \
\r
187 DebugLog3("after lock: %s %d", __FILE__, __LINE__);
\r
192 #ifndef RAYM_MUTEX_CHECK
\r
193 inline void RaymUnlock(Object *obj)
\r
196 LeaveCriticalSection(&(obj->_cs));
\r
202 #define RaymUnlock(obj) \
\r
203 DebugLog3("before unlock: %s %d", __FILE__, __LINE__); \
\r
204 LeaveCriticalSection(&(obj->_cs)); \
\r
205 DebugLog3("after unlock: %s %d", __FILE__, __LINE__);
\r
210 #ifndef RAYM_MUTEX_CHECK
\r
211 inline void RaymCondWait(Object *obj)
\r
214 SleepConditionVariableCS(&(obj->_cond), &(obj->_cs), INFINITE);
\r
220 #define RaymCondWait(obj) \
\r
221 DebugLog3("before wait: %s %d", __FILE__, __LINE__); \
\r
222 SleepConditionVariableCS(&(obj->_cond), &(obj->_cs), INFINITE); \
\r
223 DebugLog3("after wait: %s %d", __FILE__, __LINE__);
\r
228 #ifndef RAYM_MUTEX_CHECK
\r
229 inline void RaymCondSignal(Object *obj)
\r
232 WakeConditionVariable(&(obj->_cond));
\r
238 #define RaymCondSignal(obj) \
\r
239 DebugLog3("before signal: %s %d", __FILE__, __LINE__); \
\r
240 WakeConditionVariable(&(obj->_cond)); \
\r
241 DebugLog3("after signal: %s %d", __FILE__, __LINE__);
\r
246 inline void RaymCondBroadcast(Object *obj)
\r
249 WakeAllConditionVariable(&(obj->_cond));
\r
255 //#define RaymCriticalSection(OBJ, BLOCK) RaymLock(OBJ); BLOCK; RaymUnlock(OBJ);
\r