#include "Core.h" namespace Upp { static StaticMutex sPteLock; PteBase::Prec *PteBase::PtrAdd() { Mutex::Lock __(sPteLock); if(prec) ++prec->n; else { prec = tiny_new(); prec->n = 1; prec->ptr = this; } return const_cast(prec); } void PteBase::PtrRelease(Prec *prec) { Mutex::Lock __(sPteLock); if(prec && --prec->n == 0) { if(prec->ptr) prec->ptr->prec = NULL; tiny_delete(prec); } } PteBase::PteBase() { prec = NULL; } PteBase::~PteBase() { Mutex::Lock __(sPteLock); if(prec) prec->ptr = NULL; } void PtrBase::Release() { PteBase::PtrRelease(prec); } void PtrBase::Set(PteBase *p) { prec = p ? p->PtrAdd() : NULL; } void PtrBase::Assign(PteBase *p) { Release(); Set(p); } PtrBase::~PtrBase() { Release(); } }