瀏覽代碼

Do not allow instantiation of HeapAllocator outside Memory.cpp

Daniele Bartolini 12 年之前
父節點
當前提交
9b2a6e4804

+ 0 - 1
engine/Android.mk

@@ -121,7 +121,6 @@ LOCAL_SRC_FILES :=\
 	core/math/Vector3.cpp\
 	core/math/Vector4.cpp\
 \
-	core/mem/HeapAllocator.cpp\
 	core/mem/LinearAllocator.cpp\
 	core/mem/Memory.cpp\
 	core/mem/PoolAllocator.cpp\

+ 0 - 2
engine/CMakeLists.txt

@@ -213,7 +213,6 @@ set (STRINGS_HEADERS
 
 set (MEM_SRC
 	core/mem/Memory.cpp
-	core/mem/HeapAllocator.cpp
 	core/mem/LinearAllocator.cpp
 	core/mem/StackAllocator.cpp
 	core/mem/ProxyAllocator.cpp
@@ -223,7 +222,6 @@ set (MEM_SRC
 set (MEM_HEADERS
 	core/mem/Memory.h
 	core/mem/Allocator.h
-	core/mem/HeapAllocator.h
 	core/mem/TempAllocator.h
 	core/mem/LinearAllocator.h
 	core/mem/StackAllocator.h

+ 0 - 1
engine/Crown.h

@@ -74,7 +74,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 // Core/Mem
 #include "Memory.h"
 #include "Allocator.h"
-#include "HeapAllocator.h"
 #include "TempAllocator.h"
 #include "LinearAllocator.h"
 #include "StackAllocator.h"

+ 2 - 6
engine/core/filesystem/File.cpp

@@ -27,7 +27,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "File.h"
 #include "Types.h"
 #include "Compressor.h"
-#include "HeapAllocator.h"
 
 namespace crown
 {
@@ -35,8 +34,7 @@ namespace crown
 //-----------------------------------------------------------------------------
 bool File::compress_to(File& file, size_t size, size_t& zipped_size, Compressor& compressor)
 {
-	HeapAllocator allocator;
-	void* in_buffer = (void*)allocator.allocate(size);
+	void* in_buffer = (void*) default_allocator().allocate(size);
 
 	read(in_buffer, size);
 
@@ -50,10 +48,8 @@ bool File::compress_to(File& file, size_t size, size_t& zipped_size, Compressor&
 //-----------------------------------------------------------------------------
 bool File::uncompress_to(File& file, size_t& unzipped_size, Compressor& compressor)
 {
-	HeapAllocator allocator;
-
 	size_t file_size = size();
-	void* in_buffer = (void*)allocator.allocate(file_size);
+	void* in_buffer = (void*) default_allocator().allocate(file_size);
 
 	read(in_buffer, file_size);
 

+ 0 - 1
engine/core/filesystem/NetworkFile.h

@@ -30,7 +30,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "File.h"
 #include "OsSocket.h"
 #include "File.h"
-#include "HeapAllocator.h"
 
 namespace crown
 {

+ 0 - 138
engine/core/mem/HeapAllocator.cpp

@@ -1,138 +0,0 @@
-/*
-Copyright (c) 2013 Daniele Bartolini, Michele Rossi
-Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#include <cstdlib>
-
-#include "HeapAllocator.h"
-#include "Assert.h"
-
-namespace crown
-{
-
-//-----------------------------------------------------------------------------
-HeapAllocator::HeapAllocator() :
-	m_allocated_size(0),
-	m_allocation_count(0)
-{
-}
-
-//-----------------------------------------------------------------------------
-HeapAllocator::~HeapAllocator()
-{
-	CE_ASSERT(m_allocation_count == 0 && allocated_size() == 0,
-		"Missing %d deallocations causing a leak of %ld bytes", m_allocation_count, allocated_size());
-}
-
-//-----------------------------------------------------------------------------
-void* HeapAllocator::allocate(size_t size, size_t align)
-{
-	ScopedMutex sm(m_mutex);
-
-	size_t actual_size = actual_allocation_size(size, align);
-
-	Header* h = (Header*)malloc(actual_size);
-	h->size = actual_size;
-
-	void* data = memory::align_top(h + 1, align);
-
-	pad(h, data);
-
-	m_allocated_size += actual_size;
-	m_allocation_count++;
-
-	return data;
-}
-
-//-----------------------------------------------------------------------------
-void HeapAllocator::deallocate(void* data)
-{
-	ScopedMutex sm(m_mutex);
-
-	if (!data) return;
-
-	Header* h = header(data);
-
-	m_allocated_size -= h->size;
-	m_allocation_count--;
-
-	free(h);
-}
-
-//-----------------------------------------------------------------------------
-size_t HeapAllocator::allocated_size()
-{
-	ScopedMutex sm(m_mutex);
-	return m_allocated_size;
-}
-
-//-----------------------------------------------------------------------------
-size_t HeapAllocator::get_size(void* data)
-{
-	ScopedMutex sm(m_mutex);
-	Header* h = header(data);
-	return h->size;
-}
-
-//-----------------------------------------------------------------------------
-size_t HeapAllocator::actual_allocation_size(size_t size, size_t align)
-{
-	return size + align + sizeof(Header);
-}
-
-//-----------------------------------------------------------------------------
-HeapAllocator::Header* HeapAllocator::header(void* data)
-{
-	uint32_t* ptr = (uint32_t*)data;
-	ptr--;
-
-	while (*ptr == memory::PADDING_VALUE)
-	{
-		ptr--;
-	}
-
-	return (Header*)ptr;
-}
-
-//-----------------------------------------------------------------------------
-void* HeapAllocator::data(Header* header, size_t align)
-{
-	return memory::align_top(header + 1, align);
-}
-
-//-----------------------------------------------------------------------------
-void HeapAllocator::pad(Header* header, void* data)
-{
-	uint32_t* p = (uint32_t*)(header + 1);
-
-	while (p != data)
-	{
-		*p = memory::PADDING_VALUE;
-		p++;
-	}
-}
-
-} // namespace crown
-

+ 0 - 76
engine/core/mem/HeapAllocator.h

@@ -1,76 +0,0 @@
-/*
-Copyright (c) 2013 Daniele Bartolini, Michele Rossi
-Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#pragma once
-
-#include "Allocator.h"
-#include "ScopedMutex.h"
-
-namespace crown
-{
-
-/// Allocator based on C malloc().
-class HeapAllocator : public Allocator
-{
-public:
-
-				HeapAllocator();
-				~HeapAllocator();
-
-	/// @copydoc Allocator::allocate()
-	void*		allocate(size_t size, size_t align = memory::DEFAULT_ALIGN);
-
-	/// @copydoc Allocator::deallocate()
-	void		deallocate(void* data);
-
-	/// @copydoc Allocator::allocated_size()
-	size_t		allocated_size();
-
-	/// Returns the size in bytes of the block of memory pointed by @a data
-	size_t		get_size(void* data);
-
-private:
-
-	// Holds the number of bytes of an allocation
-	struct Header
-	{
-		uint32_t	size;
-	};
-
-	size_t		actual_allocation_size(size_t size, size_t align);
-	Header*		header(void* data);
-	void*		data(Header* header, size_t align);
-	void		pad(Header* header, void* data);
-
-private:
-
-	Mutex		m_mutex;
-	size_t		m_allocated_size;
-	uint32_t	m_allocation_count;
-};
-
-} // namespace crown
-

+ 123 - 1
engine/core/mem/Memory.cpp

@@ -25,7 +25,8 @@ OTHER DEALINGS IN THE SOFTWARE.
 */
 
 #include "Memory.h"
-#include "HeapAllocator.h"
+#include "Allocator.h"
+#include "ScopedMutex.h"
 
 // //-----------------------------------------------------------------------------
 // void* operator new(size_t) throw (std::bad_alloc)
@@ -60,6 +61,127 @@ namespace crown
 namespace memory
 {
 
+/// Allocator based on C malloc().
+class HeapAllocator : public Allocator
+{
+public:
+
+	HeapAllocator()
+		: m_allocated_size(0)
+		, m_allocation_count(0)
+	{
+	}
+
+	~HeapAllocator()
+	{
+		CE_ASSERT(m_allocation_count == 0 && allocated_size() == 0,
+			"Missing %d deallocations causing a leak of %ld bytes", m_allocation_count, allocated_size());
+	}
+
+	/// @copydoc Allocator::allocate()
+	void* allocate(size_t size, size_t align = memory::DEFAULT_ALIGN)
+	{
+		ScopedMutex sm(m_mutex);
+
+		size_t actual_size = actual_allocation_size(size, align);
+
+		Header* h = (Header*)malloc(actual_size);
+		h->size = actual_size;
+
+		void* data = memory::align_top(h + 1, align);
+
+		pad(h, data);
+
+		m_allocated_size += actual_size;
+		m_allocation_count++;
+
+		return data;
+	}
+
+	/// @copydoc Allocator::deallocate()
+	void deallocate(void* data)
+	{
+		ScopedMutex sm(m_mutex);
+
+		if (!data) return;
+
+		Header* h = header(data);
+
+		m_allocated_size -= h->size;
+		m_allocation_count--;
+
+		free(h);
+	}
+
+	/// @copydoc Allocator::allocated_size()
+	size_t allocated_size()
+	{
+		ScopedMutex sm(m_mutex);
+		return m_allocated_size;
+	}
+
+	/// Returns the size in bytes of the block of memory pointed by @a data
+	size_t get_size(void* data)
+	{
+		ScopedMutex sm(m_mutex);
+		Header* h = header(data);
+		return h->size;
+	}
+
+private:
+
+	// Holds the number of bytes of an allocation
+	struct Header
+	{
+		uint32_t	size;
+	};
+
+	//-----------------------------------------------------------------------------
+	size_t actual_allocation_size(size_t size, size_t align)
+	{
+		return size + align + sizeof(Header);
+	}
+
+	//-----------------------------------------------------------------------------
+	Header* header(void* data)
+	{
+		uint32_t* ptr = (uint32_t*)data;
+		ptr--;
+
+		while (*ptr == memory::PADDING_VALUE)
+		{
+			ptr--;
+		}
+
+		return (Header*)ptr;
+	}
+
+	//-----------------------------------------------------------------------------
+	void* data(Header* header, size_t align)
+	{
+		return memory::align_top(header + 1, align);
+	}
+
+	//-----------------------------------------------------------------------------
+	void pad(Header* header, void* data)
+	{
+		uint32_t* p = (uint32_t*)(header + 1);
+
+		while (p != data)
+		{
+			*p = memory::PADDING_VALUE;
+			p++;
+		}
+	}
+
+private:
+
+	Mutex		m_mutex;
+	size_t		m_allocated_size;
+	uint32_t	m_allocation_count;
+};
+
+// Create default allocators
 static char buffer[1024];
 static HeapAllocator* g_default_allocator = NULL;
 

+ 0 - 1
engine/renderers/backend/gl/GLRenderer.h

@@ -40,7 +40,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "Renderer.h"
 #include "Resource.h"
 #include "GLContext.h"
-#include "HeapAllocator.h"
 #include "VertexFormat.h"
 #include "Allocator.h"
 

+ 0 - 1
engine/world/World.h

@@ -27,7 +27,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 #pragma once
 
 #include "Camera.h"
-#include "HeapAllocator.h"
 #include "IdArray.h"
 #include "LinearAllocator.h"
 #include "PhysicsTypes.h"