22#define __strlen(s) wcslen(s)
23#define __strcpy(d, s) wcscpy(d, s)
24#define __strncpy(d, s, n) wcsncpy(d, s, n)
27#define __DCL_ASSERT_N(expr)
37 pthread_mutex_init(&m_mutex,
NULL);
39 InitializeCriticalSection(&m_cs);
47 pthread_mutex_destroy(&m_mutex);
49 DeleteCriticalSection(&m_cs);
56 pthread_mutex_lock(&m_mutex);
58 EnterCriticalSection(&m_cs);
65 pthread_mutex_unlock(&m_mutex);
67 LeaveCriticalSection(&m_cs);
71#if __DCL_HAVE_ALLOC_DEBUG
72size_t AllocList::Node::size()
74 size_t r =
sizeof(Node) % 8;
76 return sizeof(Node) + 8 -
r;
80void* AllocList::Node::data()
const
82 return (
char*)
this + Node::size();
85void AllocList::Node::assignFileName(
const char_t* _filename)
90 if (nLen > __DCL_DEBUG_PATH_MAX) {
93 _filename += nLen - __DCL_DEBUG_PATH_MAX + 8;
94 __strcpy(szFileName + 11, _filename);
100AllocList::Node* AllocList::allocNode(
103 DCLAllocFunction allocFunction,
110 Node* pNewNode = (Node*)malloc(Node::size() + nSize);
113 pNewNode->bCheck = bCheck;
114 pNewNode->allocFunction = allocFunction;
117 pNewNode->assignFileName(_filename);
119 pNewNode->szFileName[0] =
'\0';
121 pNewNode->nLine = _line;
122 pNewNode->nSize = nSize;
127void* AllocList::addTail(Node* pNewNode)
131 NodeBase* pMasterNode = &m_masterNode;
133 pNewNode->
pNext = pMasterNode;
137 pMasterNode->
pPrev = pNewNode;
140 return pNewNode->data();
143AllocList::Node* AllocList::reallocNode(
158 bool bCheckSave = pNode->bCheck;
159 DCLAllocFunction allocTypeSave = pNode->allocFunction;
161 Node* pNewNode = (Node*)realloc(pNode, Node::size() + nSize);
163 if (pNewNode != pNode) {
164 pPrevSave->
pNext = pNewNode;
165 pNextSave->
pPrev = pNewNode;
171 pNewNode->bCheck = bCheckSave;
172 pNewNode->allocFunction = allocTypeSave;
176 pNewNode->assignFileName(_filename);
178 pNewNode->szFileName[0] = L
'\0';
180 pNewNode->nLine = _line;
181 pNewNode->nSize = nSize;
186AllocList::AllocList()
188 NodeBase* pMasterNode = &m_masterNode;
189 pMasterNode->
pPrev = pMasterNode;
190 pMasterNode->
pNext = pMasterNode;
195AllocList::~AllocList()
201AllocList::Node* AllocList::begin()
const
203 const NodeBase* pMasterNode = &m_masterNode;
205 if (pMasterNode->
pNext == pMasterNode)
208 return (Node*)pMasterNode->
pNext;
211AllocList::Node* AllocList::end()
const
213 const NodeBase* pMasterNode = &m_masterNode;
215 if (pMasterNode->
pPrev == pMasterNode)
218 return (Node*)pMasterNode->
pPrev;
221AllocList::Node* AllocList::next(Node*& pNode)
const
225 const NodeBase* pMasterNode = &m_masterNode;
227 if (pNode->pNext == pMasterNode)
230 pNode = (Node*)pNode->pNext;
235AllocList::Node* AllocList::prev(Node*& pNode)
const
239 const NodeBase* pMasterNode = &m_masterNode;
241 if (pNode->pPrev == pMasterNode)
244 pNode = (Node*)pNode->pPrev;
249AllocList::Node* AllocList::find(
const void* p)
const
251 const NodeBase* pMasterNode = &m_masterNode;
254 while(pNode != pMasterNode) {
255 if (((Node*)pNode)->data() == p)
258 pNode = pNode->pNext;
263AllocList::Node* AllocList::rfind(
const void* p)
const
265 const NodeBase* pMasterNode = &m_masterNode;
268 while(pNode != pMasterNode) {
269 if (((Node*)pNode)->data() == p)
272 pNode = pNode->pPrev;
277void* AllocList::allocAddTail(
280 DCLAllocFunction allocFunction,
285 Node* pNewNode = allocNode(
293 return addTail(pNewNode);
298void AllocList::erase(Node* pNode)
301 pNode->pPrev->pNext = pNode->pNext;
302 pNode->pNext->pPrev = pNode->pPrev;
308void AllocList::clear()
310 NodeBase* pMasterNode = &m_masterNode;
313 while(pNode != pMasterNode) {
315 pNode = pNode->
pNext;
319 pMasterNode->
pNext = pMasterNode;
320 pMasterNode->
pPrev = pMasterNode;
332 size_t nBytes =
sizeof(
NodeBase) * nBuckets;
334 for(
size_t i = 0; i < nBuckets; i++) {
348 while(pNode != pMasterNode) {
350 pNode = pNode->
pNext;
362 while(pNode != pMasterNode) {
363 if (((
Node*)pNode)->key == key)
364 return ((
Node*)pNode)->value;
365 pNode = pNode->
pNext;
369 pNewNode->
pPrev = pMasterNode;
372 pMasterNode->
pNext = pNewNode;
375 return pNewNode->
value;
384 while(pNode != pMasterNode) {
385 if (((
Node*)pNode)->key == key)
387 pNode = pNode->
pNext;
408 , lockGlobalOutput(
"LibState::lockGlobalOutput")
409 , mapThreadOutput(MAP_THREAD_OUTPUT_BUCKET_COUNT)
410 , lockThreadOutput(
"LibState::lockThreadOutput")
411#
if __DCL_HAVE_ALLOC_DEBUG
412 , lockAlloc(
"LibState::lockAlloc")
DCLCAPI size_t DCLGetNextPrimNumber(size_t _n)
DCLCAPI size_t DCLGetNextPrimNumber(size_t _n)
#define __DCL_ASSERT_N(expr)
#define __strncpy(d, s, n)
if(!__handle->open(bs, bs.length()))
InternalMutex(const char *pszName)
size_t bucketNumber(const void *key) const
PtrHashMap(size_t nBuckets)
Node * find(const void *key) const
const void *& operator[](const void *key)
static unsigned long getCurrentThreadId()
DCLCleanupCallback pfnSQLCleanup
InternalMutex lockSQLDriverPool