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_ |