📄 xmlcache.cpp
字号:
//xmlcache.cpp
#include "xml.h"
CLock::CLock()
{
#ifdef WIN32
m_mut = CreateMutex(0,FALSE,0);
assert(m_mut);
#else
pthread_mutex_init(&m_mut);
#endif
}
CLock::~CLock()
{
#ifdef WIN32
if(m_mut) CloseHandle(m_mut);
#else
pthread_mutex_destroy(&m_mut);
#endif
}
void CLock::lock()
{
#ifdef WIN32
WaitForSingleObject(m_mut,(unsigned long)-1);
#else
pthread_mutex_lock(&m_mut);
#endif
}
void CLock::unlock()
{
#ifdef WIN32
ReleaseMutex(m_mut);
#else
pthread_mutex_unlock(&m_mut);
#endif
}
CXMLAttribCache::CXMLAttribCache() : m_alimit(0),m_flimit(0),m_acount(0),m_fcount(0),m_last(0),m_first(0)
{
}
CXMLAttribCache::~CXMLAttribCache()
{
clean();
}
void CXMLAttribCache::clean()
{
m_lock.lock();
CXMLAttrib *a = m_first;
m_first = m_last = 0;
m_acount = m_fcount = 0;
m_lock.unlock();
if(a) delete a;
}
void CXMLAttribCache::saveup(CXMLAttrib *a)
{
if(a->getNext())
{
for(CXMLAttrib *p=a;p;)
{
a = a->getNext();
p->setNext(0);
p->setPrev(0);
saveup(p);
p = a;
}
return;
}
a->setNode(0);
m_lock.lock();
if(!m_flimit || m_fcount<m_flimit)
{
if(!m_first)
{
assert(!m_last);
m_first = m_last = a;
}
else
{
a->setNext(m_first);
m_first->setPrev(a);
m_first = a;
}
++m_fcount;
a = 0;
}
m_lock.unlock();
if(a){--m_acount;delete a;}
}
CXMLAttrib* CXMLAttribCache::reuse(bool nonew)
{
m_lock.lock();
CXMLAttrib *a = m_first;
if(m_first)
{
if(m_first==m_last) m_first = m_last = 0;
else
{
m_first = m_first->getNext();
m_first->setPrev(0);
}
a->setPrev(0);
a->setNext(0);
}
m_lock.unlock();
if(!a && !nonew && (!m_alimit || m_acount<m_alimit))
{
a = new CXMLAttrib;
if(a) ++m_acount;
}
if(a) a->setCache(this);
return a;
}
CXMLNodeCache::CXMLNodeCache() : m_alimit(0),m_flimit(0),m_acount(0),m_fcount(0),m_last(0),m_first(0)
{
}
CXMLNodeCache::~CXMLNodeCache()
{
clean();
}
void CXMLNodeCache::clean()
{
m_lock.lock();
CXMLNode *x = m_first;
m_first = m_last = 0;
m_acount = m_fcount = 0;
m_lock.unlock();
if(x) delete x;
}
void CXMLNodeCache::saveup(CXMLNode *x)
{
if(x->getNext())
{
for(CXMLNode *p=x;p;)
{
x = x->getNext();
p->setNext(0);
p->setPrev(0);
saveup(p);
p = x;
}
return;
}
if(x->getFirstChild()) saveup(x->removeChildrenTree());
x->setParent(0);
if(x->getFirstAttrib()) m_xac.saveup(x->removeAttribTree());
m_lock.lock();
if(!m_flimit || m_fcount<m_flimit)
{
if(!m_first)
{
assert(!m_last);
m_first = m_last = x;
}
else
{
x->setNext(m_first);
m_first->setPrev(x);
m_first = x;
}
++m_fcount;
x = 0;
}
m_lock.unlock();
if(x){--m_acount;delete x;}
}
CXMLNode* CXMLNodeCache::reuse(bool nonew)
{
m_lock.lock();
CXMLNode *x = m_first;
if(m_first)
{
if(m_first==m_last) m_first = m_last = 0;
else
{
m_first = m_first->getNext();
m_first->setPrev(0);
}
x->setNext(0);
}
m_lock.unlock();
if(!x && !nonew && (!m_alimit || m_acount<m_alimit))
{
x = new CXMLNode;
if(x) ++m_acount;
}
if(x) x->setCache(this);
return x;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -