OSDN Git Service

暫定登録
[iptd/iPTd.git] / src / Raym / Object.h
1 //\r
2 // Object.h\r
3 //\r
4 \r
5 #pragma once\r
6 \r
7 #define OBJC_MEMORY_CHECK\r
8 \r
9 #ifdef _WIN32\r
10 #include <windows.h>\r
11 #else\r
12 #include <pthread.h>\r
13 #endif\r
14 #include <stdlib.h>\r
15 #include <Raym/Runtime.h>\r
16 \r
17 #define SET_METHOD(P1, P2)  \\r
18     if ((P1) != NULL)       \\r
19     {                       \\r
20         (P1)->release();    \\r
21     }                       \\r
22     (P1) = (P2);            \\r
23     if ((P1) != NULL)       \\r
24     {                       \\r
25         (P1)->retain();     \\r
26     }\r
27 \r
28 #define RELEASE(P1)         \\r
29     if ((P1) != NULL)       \\r
30     {                       \\r
31         (P1)->release();    \\r
32         (P1) = NULL;        \\r
33     }\r
34 \r
35 #define isKindOfClass(CLS, OBJ) \\r
36     (strcmp(#CLS, (OBJ)->className()) == 0)\r
37 \r
38 \r
39 #ifdef _WIN32\r
40 \r
41 #define OBJC_LOCK_CREATE    InitializeCriticalSection(&_cs)\r
42 #define OBJC_LOCK_DESTROY   DeleteCriticalSection(&_cs)\r
43 /*\r
44 #define OBJC_LOCK(OBJ) \\r
45     DebugLog4("ECS_B:[0x%08X:0x%08X] %s() at %d\n", (unsigned int)(OBJ), GetCurrentThreadId(), __FUNCTION__, __LINE__); \\r
46     EnterCriticalSection(&(OBJ)->_cs); \\r
47     DebugLog4("ECS_A:[0x%08X:0x%08X] %s() at %d\n", (unsigned int)(OBJ), GetCurrentThreadId(), __FUNCTION__, __LINE__);\r
48 \r
49 #define OBJC_UNLOCK(OBJ) \\r
50     DebugLog4("LCS_B:[0x%08X:0x%08X] %s() at %d\n", (unsigned int)(OBJ), GetCurrentThreadId(), __FUNCTION__, __LINE__); \\r
51     LeaveCriticalSection(&(OBJ)->_cs); \\r
52     DebugLog4("LCS_A:[0x%08X:0x%08X] %s() at %d\n", (unsigned int)(OBJ), GetCurrentThreadId(), __FUNCTION__, __LINE__);\r
53 */\r
54 \r
55 #define DEFINE_STATIC_MUTEX(variable)       \\r
56 class STATIC_MUTEX_variable                 \\r
57 {                                           \\r
58 private:                                    \\r
59     CRITICAL_SECTION _cs;                   \\r
60                                             \\r
61 public:                                     \\r
62     STATIC_MUTEX_variable()                 \\r
63     {                                       \\r
64         InitializeCriticalSection(&_cs);    \\r
65     }                                       \\r
66     ~STATIC_MUTEX_variable()                \\r
67     {                                       \\r
68         DeleteCriticalSection(&_cs);        \\r
69     }                                       \\r
70     void lock()                             \\r
71     {                                       \\r
72         EnterCriticalSection(&_cs);         \\r
73     }                                       \\r
74     void unlock()                           \\r
75     {                                       \\r
76         LeaveCriticalSection(&_cs);         \\r
77     }                                       \\r
78 };                                          \\r
79 static STATIC_MUTEX_variable variable;\r
80 \r
81 #else\r
82 \r
83 #define OBJC_LOCK_CREATE    {                                   \\r
84     pthread_mutexattr_t attr;                                   \\r
85     pthread_mutexattr_init(&attr);                              \\r
86     pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);  \\r
87     pthread_mutex_init(&_lock, &attr);                          \\r
88 }\r
89 #define OBJC_LOCK_DESTROY   pthread_mutex_destroy(&_lock)\r
90 #define OBJC_LOCK           pthread_mutex_lock(&_lock)\r
91 #define OBJC_UNLOCK         pthread_mutex_unlock(&_lock)\r
92 \r
93 #endif\r
94 \r
95 namespace Raym\r
96 {\r
97 \r
98 #ifdef OBJC_MEMORY_CHECK\r
99 extern int global_objc_count_;\r
100 extern int global_objc_init_count_;\r
101 extern int global_objc_retain_count_;\r
102 extern int global_objc_autorelease_count_;\r
103 extern int global_objc_release_count_;\r
104 #endif\r
105 \r
106 typedef unsigned int    uint;\r
107 typedef unsigned char   uchar;\r
108 \r
109 class String;\r
110 \r
111 class Object\r
112 {\r
113 protected:\r
114     Object();\r
115     virtual ~Object();\r
116 \r
117 #ifdef _WIN32\r
118     CRITICAL_SECTION    _cs;\r
119 #else\r
120     pthread_mutex_t     _lock;\r
121 #endif\r
122     int                 _retainCount;\r
123 \r
124 public:\r
125     //\r
126     static Object *alloc();\r
127 \r
128     //\r
129     Object *init();\r
130     Object *retain();\r
131     Object *autorelease();\r
132     Object *autorelease(bool rootPool);\r
133     void release();\r
134 \r
135     virtual String *description();\r
136 \r
137 //    virtual const char *className() = 0;\r
138     virtual const char *className();\r
139 \r
140     friend void OBJC_LOCK(Object *);\r
141     friend void OBJC_UNLOCK(Object *);\r
142 };\r
143 \r
144 inline void OBJC_LOCK(Object *obj)\r
145 {\r
146 #ifdef _WIN32\r
147     EnterCriticalSection(&(obj->_cs));\r
148 #else\r
149 #endif\r
150 }\r
151 \r
152 inline void OBJC_UNLOCK(Object *obj)\r
153 {\r
154 #ifdef _WIN32\r
155     LeaveCriticalSection(&(obj->_cs));\r
156 #else\r
157 #endif\r
158 }\r
159 \r
160 } // Raym\r
161 \r