DCL 3.7.4
Loading...
Searching...
No Matches
LibState.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#include <stdlib.h>
4#include <string.h>
5#include <wchar.h> // wcslen, wcscpy, wcsncpy
6
7#if __DCL_PTHREAD
8 #include <pthread.h> // pthread_mutex_lock, pthread_mutex_unlock
9#elif defined(__WINNT__)
10 #include <windows.h> // InterlockedIncrement, InterlockedDecrement
11#endif
12
13#include <dcl/Thread.h>
14#include "LibState.h"
15
16#undef new
17#undef malloc
18#undef realloc
19#undef calloc
20#undef free
21
22#define __strlen(s) wcslen(s)
23#define __strcpy(d, s) wcscpy(d, s)
24#define __strncpy(d, s, n) wcsncpy(d, s, n)
25
26#define __TRACE_THIS 0
27#define __DCL_ASSERT_N(expr)
28
29#if __DCL_HAVE_THIS_FILE__
30#undef __THIS_FILE__
31static const char_t __UNUSED__ __THIS_FILE__[] = __T("dcl/LibState.cpp");
32#endif
33
34__DCL_BEGIN_NAMESPACE
35
37{
38#if __DCL_PTHREAD
39 pthread_mutex_init(&__mutex, NULL);
40#elif defined(__WINNT__)
41 InitializeCriticalSection(&__cs);
42#endif
43 __name = _name;
44}
45
47{
48#if __DCL_PTHREAD
49 pthread_mutex_destroy(&__mutex);
50#elif defined(__WINNT__)
51 DeleteCriticalSection(&__cs);
52#endif
53}
54
56{
57#if __DCL_PTHREAD
58 pthread_mutex_lock(&__mutex);
59#elif defined(__WINNT__)
60 EnterCriticalSection(&__cs);
61#endif
62}
63
65{
66#if __DCL_PTHREAD
67 pthread_mutex_unlock(&__mutex);
68#elif defined(__WINNT__)
69 LeaveCriticalSection(&__cs);
70#endif
71}
72
73#if __DCL_HAVE_ALLOC_DEBUG
74size_t AllocList::Node::SIZE()
75{
76#if 0
77 size_t r = sizeof(Node) % sizeof(void*);
78 if (r)
79 return sizeof(Node) + sizeof(void*) - r;
80#endif
81 return sizeof(Node);
82}
83
84void* AllocList::Node::DATA() const
85{
86 return (char*)this + Node::SIZE();
87}
88
89void AllocList::Node::setFilename(const char_t* _filename)
90{
91 __DCL_ASSERT_N(_filename != NULL);
92
93 size_t len = __strlen(_filename);
94 if (len > __DCL_DEBUG_PATH_MAX) {
95 __strncpy(filename, _filename, 8);
96 __strncpy(filename + 8, __T("..."), 3);
97 _filename += len - __DCL_DEBUG_PATH_MAX + 8;
98 __strcpy(filename + 11, _filename);
99 }
100 else {
101 __strcpy(filename, _filename);
102 }
103}
104
105AllocList::Node* AllocList::allocNode(
106 size_t _size,
107 bool _check,
108 DCLAllocFunc _func,
109 const char_t* _filename,
110 unsigned int _line
111)
112{
113 __DCL_ASSERT_N(_size > 0);
114
115 Node* newNode = (Node*)malloc(Node::SIZE() + _size);
116 if (newNode) {
117 newNode->thread = Thread::self();
118 newNode->check = _check;
119 newNode->func = _func;
120
121 if (_filename)
122 newNode->setFilename(_filename);
123 else
124 newNode->filename[0] = '\0';
125
126 newNode->line = _line;
127 newNode->size = _size;
128 newNode->data = newNode->DATA();
129 }
130 return newNode;
131}
132
133void* AllocList::addTail(Node* _newNode)
134{
135 __DCL_ASSERT_N(_newNode != NULL);
136
137 NodeBase* masterNode = &__masterNode;
138
139 _newNode->next = masterNode;
140 _newNode->prev = masterNode->prev;
141
142 _newNode->prev->next = _newNode;
143 masterNode->prev = _newNode;
144 __nodeCount++;
145
146 return _newNode->data;
147}
148
149AllocList::Node* AllocList::reallocNode(
150 Node* _node,
151 size_t _size,
152 const char_t* _filename,
153 unsigned int _line
154)
155{
156 __DCL_ASSERT_N(_node != NULL);
157 __DCL_ASSERT_N(_size > 0);
158
159 // realloc은 realloc전과 후의 주소가 서로 다를 수 있다.
160 // 이전의 노드 정보를 저장한다.
161 NodeBase* prev_ = _node->prev;
162 NodeBase* next_ = _node->next;
163
164 bool check_ = _node->check;
165 DCLAllocFunc func_ = _node->func;
166
167 Node* reNode = (Node*)realloc(_node, Node::SIZE() + _size);
168 if (reNode) {
169 if (reNode != _node) {
170 prev_->next = reNode;
171 next_->prev = reNode;
172
173 // reNode->prev = prev_;
174 // reNode->next = next_;
175
176 reNode->thread = Thread::self();
177 reNode->check = check_;
178 reNode->func = func_;
179 }
180
181 if (_filename)
182 reNode->setFilename(_filename);
183 else
184 reNode->filename[0] = L'\0';
185
186 reNode->line = _line;
187 reNode->size = _size;
188 reNode->data = reNode->DATA();
189 }
190 return reNode;
191}
192
193AllocList::AllocList()
194{
195 __nodeCount = 0;
196 NodeBase* masterNode = &__masterNode;
197 masterNode->prev = masterNode;
198 masterNode->next = masterNode;
199}
200
201AllocList::~AllocList()
202{
203// if (__nodeCount)
204// clear();
205}
206
207AllocList::Node* AllocList::begin() const
208{
209 const NodeBase* masterNode = &__masterNode;
210 if (masterNode->next == masterNode)
211 return NULL;
212
213 return (Node*)masterNode->next;
214}
215
216AllocList::Node* AllocList::end() const
217{
218 const NodeBase* masterNode = &__masterNode;
219 if (masterNode->prev == masterNode)
220 return NULL;
221
222 return (Node*)masterNode->prev;
223}
224
225AllocList::Node* AllocList::next(Node*& _node) const
226{
227 __DCL_ASSERT_N(_node != NULL);
228 const NodeBase* masterNode = &__masterNode;
229 if (_node->next == masterNode)
230 _node = NULL;
231 else
232 _node = (Node*)_node->next;
233
234 return _node;
235}
236
237AllocList::Node* AllocList::prev(Node*& _node) const
238{
239 __DCL_ASSERT_N(_node != NULL);
240 const NodeBase* masterNode = &__masterNode;
241 if (_node->prev == masterNode)
242 _node = NULL;
243 else
244 _node = (Node*)_node->prev;
245
246 return _node;
247}
248
249AllocList::Node* AllocList::find(const void* _ptr) const
250{
251 const NodeBase* masterNode = &__masterNode;
252 const NodeBase* node = masterNode->next;
253 while(node != masterNode) {
254 if (((Node*)node)->data == _ptr)
255 return (Node*)node;
256
257 node = node->next;
258 }
259 return NULL;
260}
261
262AllocList::Node* AllocList::rfind(const void* _ptr) const
263{
264 const NodeBase* masterNode = &__masterNode;
265 const NodeBase* node = masterNode->prev;
266 while(node != masterNode) {
267 if (((Node*)node)->data == _ptr)
268 return (Node*)node;
269
270 node = node->prev;
271 }
272 return NULL;
273}
274
275void* AllocList::allocAddTail(
276 size_t _size,
277 bool _check,
278 DCLAllocFunc _func,
279 const char_t* _filename,
280 unsigned int _line
281)
282{
283 Node* newNode = allocNode(
284 _size,
285 _check,
286 _func,
287 _filename,
288 _line
289 );
290 if (newNode)
291 return addTail(newNode);
292
293 return NULL;
294}
295
296void AllocList::erase(Node* _node)
297{
298 __DCL_ASSERT_N(_node != NULL);
299 _node->prev->next = _node->next;
300 _node->next->prev = _node->prev;
301
302 free(_node);
303 __nodeCount--;
304}
305
306void AllocList::clear()
307{
308 NodeBase* masterNode = &__masterNode;
309 NodeBase* temp = NULL;
310 NodeBase* node = masterNode->next;
311 while(node != masterNode) {
312 temp = node;
313 node = node->next;
314 free(temp);
315 }
316
317 masterNode->next = masterNode;
318 masterNode->prev = masterNode;
319 __nodeCount = 0;
320}
321
322#endif // __DCL_HAVE_ALLOC_DEBUG
323
324extern DCLCAPI size_t DCLGetNextPrimNumber(size_t _n);
325
327{
328 __nodeCount = 0;
330 __buckets = (NodeBase*)malloc(sizeof(NodeBase) * __bucketCount);
331 for(size_t i = 0; i < __bucketCount; i++) {
332 NodeBase* node = &(__buckets[i]);
333 node->prev = node->next = node;
334 }
335}
336
338{
339 for(size_t i = 0; i < __bucketCount; i++) {
340 NodeBase* temp = NULL;
341 NodeBase* masterNode = &(__buckets[i]);
342 NodeBase* node = masterNode->next;
343 while(node != masterNode) {
344 temp = node;
345 node = node->next;
346 free(temp);
347 }
348 }
349 free(__buckets);
350}
351
352const void*& PtrHashMap::operator [] (const void* _key)
353{
354 NodeBase* masterNode = __buckets + bucketIndex(_key);
355 NodeBase* node = masterNode->next;
356 while(node != masterNode) {
357 if (((Node*)node)->key == _key)
358 return ((Node*)node)->value;
359 node = node->next;
360 }
361
362 Node* newNode = (Node*)malloc(sizeof(Node));
363 newNode->prev = masterNode;
364 newNode->next = masterNode->next;
365 newNode->next->prev = newNode;
366 masterNode->next = newNode;
367 __nodeCount++;
368 newNode->key = _key;
369 return newNode->value;
370}
371
372PtrHashMap::Node* PtrHashMap::find(const void* _key) const
373{
374 NodeBase* masterNode = __buckets + bucketIndex(_key);
375 NodeBase* node = masterNode->next;
376// int i = 1;
377 while(node != masterNode) {
378 if (((Node*)node)->key == _key)
379 return (Node*)node;
380 node = node->next;
381// printf("collision: %d\n", i++);
382 }
383 return NULL;
384}
385
387{
388 __DCL_ASSERT_N(_node != NULL);
389
390 _node->prev->next = _node->next;
391 _node->next->prev = _node->prev;
392
393 free(_node);
394 __nodeCount--;
395}
396
398 : lockSQLDriverPool("LibState::lockSQLDriverPool")
399#ifdef __DCL_DEBUG
400 , lockGlobalOutput("LibState::lockGlobalOutput")
401 , mapThreadOutput(MAP_THREAD_OUTPUT_BUCKET_COUNT)
402 , lockThreadOutput("LibState::lockThreadOutput")
403#if __DCL_HAVE_ALLOC_DEBUG
404 , lockAlloc("LibState::lockAlloc")
405#endif // __DCL_HAVE_ALLOC_DEBUG
406#endif // __DCL_DEBUG
407{
409}
413
414__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:312
#define __UNUSED__
Definition Config.h:341
#define DCLCAPI
Definition Config.h:95
wchar_t char_t
Definition Config.h:247
DCLCAPI size_t DCLGetNextPrimNumber(size_t _n)
Definition HashFun.cpp:23
#define __strcpy(d, s)
Definition LibState.cpp:23
DCLCAPI size_t DCLGetNextPrimNumber(size_t _n)
Definition HashFun.cpp:23
#define __strlen(s)
Definition LibState.cpp:22
#define __DCL_ASSERT_N(expr)
Definition LibState.cpp:27
#define __strncpy(d, s, n)
Definition LibState.cpp:24
IOException *size_t r
Definition MediaInfo.cpp:82
if(r==0)
Definition MediaInfo.cpp:83
#define __T(str)
Definition Object.h:60
InternalMutex(const char *_name)
Definition LibState.cpp:36
void unlock()
Definition LibState.cpp:64
void erase(Node *_node)
Definition LibState.cpp:386
size_t bucketIndex(const void *_key) const
Definition LibState.h:174
NodeBase * __buckets
Definition LibState.h:169
size_t __nodeCount
Definition LibState.h:171
const void *& operator[](const void *_key)
Definition LibState.cpp:352
size_t __bucketCount
Definition LibState.h:170
Node * find(const void *_key) const
Definition LibState.cpp:372
PtrHashMap(size_t _buckerCount)
Definition LibState.cpp:326
static thread_t self()
Definition Thread.cpp:175
DCLCleanupCallback pfnSQLCleanup
Definition LibState.h:187
InternalMutex lockSQLDriverPool
Definition LibState.h:186
struct NodeBase * prev
Definition LibState.h:141
struct NodeBase * next
Definition LibState.h:142
const void * key
Definition LibState.h:147
const void * value
Definition LibState.h:148