fixed various segfaults in decoder and renderer
This commit is contained in:
+32
-11
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user