From 7686d6ee57038e848f75130563fc78c1adebc1a2 Mon Sep 17 00:00:00 2001 From: click Date: Fri, 27 Aug 2010 01:52:05 +0200 Subject: Core/Dependency: Upgrade G3d-library to v8.0-release (patched version!) Note: Due to issues with G3D (normally requiring X11 and the ZIP-library), the sourcetree version contains a modified version. The applied patch is commited to the repository for future reference. --HG-- branch : trunk --- dep/g3dlite/source/AreaMemoryManager.cpp | 87 ++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 dep/g3dlite/source/AreaMemoryManager.cpp (limited to 'dep/g3dlite/source/AreaMemoryManager.cpp') diff --git a/dep/g3dlite/source/AreaMemoryManager.cpp b/dep/g3dlite/source/AreaMemoryManager.cpp new file mode 100644 index 00000000000..00cb33dc91f --- /dev/null +++ b/dep/g3dlite/source/AreaMemoryManager.cpp @@ -0,0 +1,87 @@ +/** + @file AreaMemoryManager.cpp + + @maintainer Morgan McGuire, http://graphics.cs.williams.edu + + @created 2009-01-20 + @edited 2009-01-20 + + Copyright 2000-2009, Morgan McGuire. + All rights reserved. + */ + +#include "G3D/AreaMemoryManager.h" +#include "G3D/System.h" + +namespace G3D { + +AreaMemoryManager::Buffer::Buffer(size_t size) : m_size(size), m_used(0) { + // Allocate space for a lot of buffers. + m_first = (uint8*)::malloc(m_size); +} + + +AreaMemoryManager::Buffer::~Buffer() { + ::free(m_first); +} + + +void* AreaMemoryManager::Buffer::alloc(size_t s) { + if (s + m_used > m_size) { + return NULL; + } else { + void* old = m_first + m_used; + m_used += s; + return old; + } +} + + +bool AreaMemoryManager::isThreadsafe() const { + return false; +} + + +AreaMemoryManager::Ref AreaMemoryManager::create(size_t sizeHint) { + return new AreaMemoryManager(sizeHint); +} + + +AreaMemoryManager::AreaMemoryManager(size_t sizeHint) : m_sizeHint(sizeHint) { + debugAssert(sizeHint > 0); +} + + +AreaMemoryManager::~AreaMemoryManager() { + deallocateAll(); +} + + +size_t AreaMemoryManager::bytesAllocated() const { + return m_sizeHint * m_bufferArray.size(); +} + + +void* AreaMemoryManager::alloc(size_t s) { + void* n = (m_bufferArray.size() > 0) ? m_bufferArray.last()->alloc(s) : NULL; + if (n == NULL) { + // This buffer is full + m_bufferArray.append(new Buffer(max(s, m_sizeHint))); + return m_bufferArray.last()->alloc(s); + } else { + return n; + } +} + + +void AreaMemoryManager::free(void* x) { + // Intentionally empty; we block deallocate +} + + +void AreaMemoryManager::deallocateAll() { + m_bufferArray.deleteAll(); + m_bufferArray.clear(); +} + +} -- cgit v1.2.3