Написал на коленке класс "кусок того самого chain vector". Словил дедлок, помогите найти ошибку в синхронизации. .h
| Код | class SafeItemBase { protected: SafeArrayPart * myParent; criticalSection itemLock; size_t refCount; bool deletePending; public: void ref(); bool unref(); SafeItemBase(); ~SafeItemBase(); bool requestDelete(); };
class SafeArrayPart { private: typedef std::vector<SafeItemBase *> array_t; array_t itemList; criticalSection arrayLock; public: size_t size(); size_t push_back(SafeArrayPart * item); SafeArrayPart * sget(size_t indx); bool sret(SafeArrayPart * item); void erase(size_t indx); bool eraseByPtr(SafeArrayPart * item); SafeArrayPart(); ~SafeArrayPart(); };
|
.cpp
| Код | void SafeItemBase::ref() { scopeLock slock(&itemLock); ++refCount; //printf("[ref]My ref = %i\n",refCount); } bool SafeItemBase::unref() { scopeLock slock(&itemLock); --refCount; //printf("[unref]My ref = %i\n",refCount); if (!refCount && deletePending) { myParent->eraseByPtr(this); return true; } return false; } SafeItemBase::SafeItemBase() { refCount = 0; deletePending = false; } SafeItemBase::~SafeItemBase() { } bool SafeItemBase::requestDelete() { scopeLock slock(&itemLock); //printf("[requestDelete]My ref = %i\n",refCount); if(refCount) deletePending = true; else { myParent->eraseByPtr(this); return true; } //printf("delete pending: %i ref count\n",refCount); return false; }
size_t SafeArrayPart::size() { scopeLock slock(&arrayLock); return itemList.size(); } size_t SafeArrayPart::push_back(SafeItemBase * item) { scopeLock slock(&arrayLock); itemList.push_back(item); return itemList.size(); } SafeItemBase * SafeArrayPart::sget(size_t indx) { scopeLock slock(&arrayLock); if(indx > itemList.size()) { printf("Invalid index: %i\n", indx); return itemList[0]; } SafeItemBase * item = itemList[indx]; item->ref(); return item; } bool SafeArrayPart::sret(SafeItemBase * item) { return item->unref(); } void SafeArrayPart::erase(size_t indx) { scopeLock slock(&arrayLock); itemList.erase(itemList.begin() + indx); } bool SafeArrayPart::eraseByPtr(SafeItemBase * item) { scopeLock slock(&arrayLock); array_t::iterator it; it = std::find(itemList.begin(),itemList.end(),item); if(it == itemList.end()) return false;
itemList.erase(it); return true; }
SafeArrayPart::SafeArrayPart() { } jeSafeArrayPart::~jeSafeArrayPart() { }
|
|