mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1020090 - Ensure we don't report leaking the GMP free list. r=jesup
This commit is contained in:
parent
74e9a36353
commit
6699a6e910
@ -6,6 +6,8 @@
|
||||
#include "GMPSharedMemManager.h"
|
||||
#include "GMPMessageUtils.h"
|
||||
#include "mozilla/ipc/SharedMemory.h"
|
||||
#include "mozilla/StaticPtr.h"
|
||||
#include "mozilla/ClearOnShutdown.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace gmp {
|
||||
@ -17,7 +19,36 @@ namespace gmp {
|
||||
// Compressed (encoded) data goes from the Decoder parent to the child;
|
||||
// pool there, and then return with Encoded() frames and goes into the parent
|
||||
// pool.
|
||||
static nsTArray<ipc::Shmem> sGmpFreelist[GMPSharedMemManager::kGMPNumTypes];
|
||||
static StaticAutoPtr<nsTArray<ipc::Shmem>> sGmpFreelist[GMPSharedMemManager::kGMPNumTypes];
|
||||
static uint32_t sGMPShmemManagerCount = 0;
|
||||
|
||||
GMPSharedMemManager::GMPSharedMemManager()
|
||||
{
|
||||
if (!sGMPShmemManagerCount) {
|
||||
for (uint32_t i = 0; i < GMPSharedMemManager::kGMPNumTypes; i++) {
|
||||
sGmpFreelist[i] = new nsTArray<ipc::Shmem>();
|
||||
}
|
||||
}
|
||||
sGMPShmemManagerCount++;
|
||||
}
|
||||
|
||||
GMPSharedMemManager::~GMPSharedMemManager()
|
||||
{
|
||||
MOZ_ASSERT(sGMPShmemManagerCount > 0);
|
||||
sGMPShmemManagerCount--;
|
||||
if (!sGMPShmemManagerCount) {
|
||||
for (uint32_t i = 0; i < GMPSharedMemManager::kGMPNumTypes; i++) {
|
||||
sGmpFreelist[i] = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static nsTArray<ipc::Shmem>&
|
||||
GetGmpFreelist(GMPSharedMemManager::GMPMemoryClasses aTypes)
|
||||
{
|
||||
return *(sGmpFreelist[aTypes]);
|
||||
}
|
||||
|
||||
static uint32_t sGmpAllocated[GMPSharedMemManager::kGMPNumTypes]; // 0's
|
||||
|
||||
bool
|
||||
@ -28,11 +59,11 @@ GMPSharedMemManager::MgrAllocShmem(GMPMemoryClasses aClass, size_t aSize,
|
||||
CheckThread();
|
||||
|
||||
// first look to see if we have a free buffer large enough
|
||||
for (uint32_t i = 0; i < sGmpFreelist[aClass].Length(); i++) {
|
||||
MOZ_ASSERT(sGmpFreelist[aClass][i].IsWritable());
|
||||
if (aSize <= sGmpFreelist[aClass][i].Size<uint8_t>()) {
|
||||
*aMem = sGmpFreelist[aClass][i];
|
||||
sGmpFreelist[aClass].RemoveElementAt(i);
|
||||
for (uint32_t i = 0; i < GetGmpFreelist(aClass).Length(); i++) {
|
||||
MOZ_ASSERT(GetGmpFreelist(aClass)[i].IsWritable());
|
||||
if (aSize <= GetGmpFreelist(aClass)[i].Size<uint8_t>()) {
|
||||
*aMem = GetGmpFreelist(aClass)[i];
|
||||
GetGmpFreelist(aClass).RemoveElementAt(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -56,21 +87,21 @@ GMPSharedMemManager::MgrDeallocShmem(GMPMemoryClasses aClass, ipc::Shmem& aMem)
|
||||
size_t total = 0;
|
||||
// XXX This works; there are better pool algorithms. We need to avoid
|
||||
// "falling off a cliff" with too low a number
|
||||
if (sGmpFreelist[aClass].Length() > 10) {
|
||||
Dealloc(sGmpFreelist[aClass][0]);
|
||||
sGmpFreelist[aClass].RemoveElementAt(0);
|
||||
if (GetGmpFreelist(aClass).Length() > 10) {
|
||||
Dealloc(GetGmpFreelist(aClass)[0]);
|
||||
GetGmpFreelist(aClass).RemoveElementAt(0);
|
||||
// The allocation numbers will be fubar on the Child!
|
||||
sGmpAllocated[aClass]--;
|
||||
}
|
||||
for (uint32_t i = 0; i < sGmpFreelist[aClass].Length(); i++) {
|
||||
MOZ_ASSERT(sGmpFreelist[aClass][i].IsWritable());
|
||||
total += sGmpFreelist[aClass][i].Size<uint8_t>();
|
||||
if (size < sGmpFreelist[aClass][i].Size<uint8_t>()) {
|
||||
sGmpFreelist[aClass].InsertElementAt(i, aMem);
|
||||
for (uint32_t i = 0; i < GetGmpFreelist(aClass).Length(); i++) {
|
||||
MOZ_ASSERT(GetGmpFreelist(aClass)[i].IsWritable());
|
||||
total += GetGmpFreelist(aClass)[i].Size<uint8_t>();
|
||||
if (size < GetGmpFreelist(aClass)[i].Size<uint8_t>()) {
|
||||
GetGmpFreelist(aClass).InsertElementAt(i, aMem);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
sGmpFreelist[aClass].AppendElement(aMem);
|
||||
GetGmpFreelist(aClass).AppendElement(aMem);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -78,7 +109,7 @@ GMPSharedMemManager::MgrDeallocShmem(GMPMemoryClasses aClass, ipc::Shmem& aMem)
|
||||
uint32_t
|
||||
GMPSharedMemManager::NumInUse(GMPMemoryClasses aClass)
|
||||
{
|
||||
return sGmpAllocated[aClass] - sGmpFreelist[aClass].Length();
|
||||
return sGmpAllocated[aClass] - GetGmpFreelist(aClass).Length();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,11 +28,8 @@ public:
|
||||
// (perhaps temporarily).
|
||||
static const uint32_t kGMPBufLimit = 20;
|
||||
|
||||
GMPSharedMemManager() {}
|
||||
|
||||
virtual ~GMPSharedMemManager() {
|
||||
// XXX free everything in the freelist
|
||||
}
|
||||
GMPSharedMemManager();
|
||||
virtual ~GMPSharedMemManager();
|
||||
|
||||
virtual bool MgrAllocShmem(GMPMemoryClasses aClass, size_t aSize,
|
||||
ipc::Shmem::SharedMemory::SharedMemoryType aType,
|
||||
|
Loading…
Reference in New Issue
Block a user