fixed various segfaults in decoder and renderer

This commit is contained in:
itsmattkc
2020-05-18 02:40:58 +10:00
parent a0f2035240
commit 814bbe8c22
22 changed files with 255 additions and 193 deletions
+32 -11
View File
@@ -57,6 +57,7 @@ public:
*/
MemoryPool(int element_count) {
element_count_ = element_count;
ignore_arena_empty_signal_ = false;
}
/**
@@ -65,6 +66,7 @@ public:
* Deletes all arenas.
*/
virtual ~MemoryPool() {
ignore_arena_empty_signal_ = true;
qDeleteAll(arenas_);
}
@@ -112,7 +114,7 @@ public:
* Automatically releases this element's memory back to the arena it was retrieved from.
*/
~Element() {
parent_->Release(this);
release();
}
DISABLE_COPY_MOVE(Element)
@@ -151,6 +153,13 @@ public:
return accessed_;
}
void release() {
if (data_) {
parent_->Release(this);
data_ = nullptr;
}
}
private:
Arena* parent_;
@@ -176,11 +185,13 @@ public:
Arena(MemoryPool* parent) {
parent_ = parent;
data_ = nullptr;
use_count_ = 0;
}
~Arena() {
// FIXME: Invalidate elements that have been lent out?
QLinkedList<Element*> copy = lent_elements_;
foreach (Element* e, copy) {
e->release();
}
delete [] data_;
}
@@ -197,8 +208,11 @@ public:
if (available_.at(i)) {
// This buffer is available
available_.replace(i, false);
use_count_++;
return std::make_shared<Element>(this, reinterpret_cast<T*>(data_ + i * element_sz_));
ElementPtr e = std::make_shared<Element>(this,
reinterpret_cast<T*>(data_ + i * element_sz_));
lent_elements_.append(e.get());
return e;
}
}
@@ -215,17 +229,18 @@ public:
int index = diff / element_sz_;
available_.replace(index, true);
use_count_--;
if (!use_count_) {
lent_elements_.removeOne(e);
if (lent_elements_.isEmpty()) {
locker.unlock();
parent_->ArenaIsEmpty(this);
}
}
const int& GetUsageCount() {
int GetUsageCount() {
QMutexLocker locker(&lock_);
return use_count_;
return lent_elements_.size();
}
bool Allocate(size_t ele_sz, size_t nb_elements) {
@@ -242,7 +257,6 @@ public:
return true;
} else {
available_.clear();
data_ = nullptr;
return false;
}
@@ -267,7 +281,7 @@ public:
size_t element_sz_;
int use_count_;
QLinkedList<Element*> lent_elements_;
};
@@ -317,6 +331,11 @@ public:
}
void ArenaIsEmpty(Arena* a) {
// FIXME: Does this need to be mutexed?
if (ignore_arena_empty_signal_) {
return;
}
QMutexLocker locker(&lock_);
if (!a->GetUsageCount()) {
@@ -343,6 +362,8 @@ private:
QMutex lock_;
bool ignore_arena_empty_signal_;
};
OLIVE_NAMESPACE_EXIT