| Index: webrtc/modules/audio_mixer/source/memory_pool_posix.h
|
| diff --git a/webrtc/modules/audio_mixer/source/memory_pool_posix.h b/webrtc/modules/audio_mixer/source/memory_pool_posix.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8eaa6887e6dd3e5d75cef79be53fe4f77be36e67
|
| --- /dev/null
|
| +++ b/webrtc/modules/audio_mixer/source/memory_pool_posix.h
|
| @@ -0,0 +1,142 @@
|
| +/*
|
| + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#ifndef WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_GENERIC_H_
|
| +#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_GENERIC_H_
|
| +
|
| +#include <assert.h>
|
| +#include <list>
|
| +
|
| +#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
|
| +#include "webrtc/typedefs.h"
|
| +
|
| +namespace webrtc {
|
| +template <class MemoryType>
|
| +class MemoryPoolImpl {
|
| + public:
|
| + // MemoryPool functions.
|
| + int32_t PopMemory(MemoryType*& memory);
|
| + int32_t PushMemory(MemoryType*& memory);
|
| +
|
| + MemoryPoolImpl(int32_t initialPoolSize);
|
| + ~MemoryPoolImpl();
|
| +
|
| + // Atomic functions
|
| + int32_t Terminate();
|
| + bool Initialize();
|
| +
|
| + private:
|
| + // Non-atomic function.
|
| + int32_t CreateMemory(uint32_t amountToCreate);
|
| +
|
| + CriticalSectionWrapper* _crit;
|
| +
|
| + bool _terminate;
|
| +
|
| + std::list<MemoryType*> _memoryPool;
|
| +
|
| + uint32_t _initialPoolSize;
|
| + uint32_t _createdMemory;
|
| + uint32_t _outstandingMemory;
|
| +};
|
| +
|
| +template <class MemoryType>
|
| +MemoryPoolImpl<MemoryType>::MemoryPoolImpl(int32_t initialPoolSize)
|
| + : _crit(CriticalSectionWrapper::CreateCriticalSection()),
|
| + _terminate(false),
|
| + _initialPoolSize(initialPoolSize),
|
| + _createdMemory(0),
|
| + _outstandingMemory(0) {}
|
| +
|
| +template <class MemoryType>
|
| +MemoryPoolImpl<MemoryType>::~MemoryPoolImpl() {
|
| + // Trigger assert if there is outstanding memory.
|
| + assert(_createdMemory == 0);
|
| + assert(_outstandingMemory == 0);
|
| + delete _crit;
|
| +}
|
| +
|
| +template <class MemoryType>
|
| +int32_t MemoryPoolImpl<MemoryType>::PopMemory(MemoryType*& memory) {
|
| + CriticalSectionScoped cs(_crit);
|
| + if (_terminate) {
|
| + memory = NULL;
|
| + return -1;
|
| + }
|
| + if (_memoryPool.empty()) {
|
| + // _memoryPool empty create new memory.
|
| + CreateMemory(_initialPoolSize);
|
| + if (_memoryPool.empty()) {
|
| + memory = NULL;
|
| + return -1;
|
| + }
|
| + }
|
| + memory = _memoryPool.front();
|
| + _memoryPool.pop_front();
|
| + _outstandingMemory++;
|
| + return 0;
|
| +}
|
| +
|
| +template <class MemoryType>
|
| +int32_t MemoryPoolImpl<MemoryType>::PushMemory(MemoryType*& memory) {
|
| + if (memory == NULL) {
|
| + return -1;
|
| + }
|
| + CriticalSectionScoped cs(_crit);
|
| + _outstandingMemory--;
|
| + if (_memoryPool.size() > (_initialPoolSize << 1)) {
|
| + // Reclaim memory if less than half of the pool is unused.
|
| + _createdMemory--;
|
| + delete memory;
|
| + memory = NULL;
|
| + return 0;
|
| + }
|
| + _memoryPool.push_back(memory);
|
| + memory = NULL;
|
| + return 0;
|
| +}
|
| +
|
| +template <class MemoryType>
|
| +bool MemoryPoolImpl<MemoryType>::Initialize() {
|
| + CriticalSectionScoped cs(_crit);
|
| + return CreateMemory(_initialPoolSize) == 0;
|
| +}
|
| +
|
| +template <class MemoryType>
|
| +int32_t MemoryPoolImpl<MemoryType>::Terminate() {
|
| + CriticalSectionScoped cs(_crit);
|
| + assert(_createdMemory == _outstandingMemory + _memoryPool.size());
|
| +
|
| + _terminate = true;
|
| + // Reclaim all memory.
|
| + while (_createdMemory > 0) {
|
| + MemoryType* memory = _memoryPool.front();
|
| + _memoryPool.pop_front();
|
| + delete memory;
|
| + _createdMemory--;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +template <class MemoryType>
|
| +int32_t MemoryPoolImpl<MemoryType>::CreateMemory(uint32_t amountToCreate) {
|
| + for (uint32_t i = 0; i < amountToCreate; i++) {
|
| + MemoryType* memory = new MemoryType();
|
| + if (memory == NULL) {
|
| + return -1;
|
| + }
|
| + _memoryPool.push_back(memory);
|
| + _createdMemory++;
|
| + }
|
| + return 0;
|
| +}
|
| +} // namespace webrtc
|
| +
|
| +#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_GENERIC_H_
|
|
|