Просмотр исходного кода

Add Allocator interface and MallocAllocator implementation

Daniele Bartolini 13 лет назад
Родитель
Сommit
60d5e92d28
4 измененных файлов с 298 добавлено и 0 удалено
  1. 55 0
      src/core/mem/Allocator.h
  2. 129 0
      src/core/mem/MallocAllocator.cpp
  3. 63 0
      src/core/mem/MallocAllocator.h
  4. 51 0
      src/core/mem/Memory.h

+ 55 - 0
src/core/mem/Allocator.h

@@ -0,0 +1,55 @@
+/*
+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 "Types.h"
+#include "Memory.h"
+
+namespace crown
+{
+
+class Allocator
+{
+public:
+
+						Allocator() {}
+	virtual				~Allocator() {}
+
+	virtual void*		allocate(size_t size, size_t align = memory::DEFAULT_ALIGN) = 0;
+	virtual void		deallocate(void* data) = 0;
+	virtual size_t		allocated_size() = 0;
+
+private:
+
+	// Disable copying
+						Allocator(const Allocator&);
+	Allocator&			operator=(const Allocator&);
+};
+
+Allocator& get_default_allocator();
+
+} // namespace crown
+

+ 129 - 0
src/core/mem/MallocAllocator.cpp

@@ -0,0 +1,129 @@
+/*
+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 "MallocAllocator.h"
+#include <cstdlib>
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+MallocAllocator::MallocAllocator() :
+	m_allocated_size(0)
+{
+}
+
+//-----------------------------------------------------------------------------
+MallocAllocator::~MallocAllocator()
+{
+}
+
+//-----------------------------------------------------------------------------
+void* MallocAllocator::allocate(size_t size, size_t align)
+{
+	size_t actual_size = actual_allocation_size(size, align);
+
+	Header* h = (Header*)malloc(actual_size);
+	h->size = actual_size;
+
+	void* data = memory::align(h + 1, align);
+
+	pad(h, data);
+
+	m_allocated_size += actual_size;
+
+	return data;
+}
+
+//-----------------------------------------------------------------------------
+void MallocAllocator::deallocate(void* data)
+{
+	Header* h = header(data);
+
+	m_allocated_size -= h->size;
+
+	free(h);
+}
+
+//-----------------------------------------------------------------------------
+size_t MallocAllocator::allocated_size()
+{
+	return m_allocated_size;
+}
+
+//-----------------------------------------------------------------------------
+size_t MallocAllocator::get_size(void* data)
+{
+	Header* h = header(data);
+
+	return h->size;
+}
+
+//-----------------------------------------------------------------------------
+size_t MallocAllocator::actual_allocation_size(size_t size, size_t align)
+{
+	return size + align + sizeof(Header);
+}
+
+//-----------------------------------------------------------------------------
+MallocAllocator::Header* MallocAllocator::header(void* data)
+{
+	uint* ptr = (uint*)data;
+	ptr--;
+
+	while (*ptr == memory::PADDING_VALUE)
+	{
+		ptr--;
+	}
+
+	return (Header*)ptr;
+}
+
+//-----------------------------------------------------------------------------
+void* MallocAllocator::data(Header* header, size_t align)
+{
+	return memory::align(header + 1, align);
+}
+
+//-----------------------------------------------------------------------------
+void MallocAllocator::pad(Header* header, void* data)
+{
+	uint* p = (uint*)(header + 1);
+
+	while (p != (uint*)data)
+	{
+		*p = memory::PADDING_VALUE;
+		p++;
+	}
+}
+
+MallocAllocator default_allocator;
+Allocator& get_default_allocator()
+{
+	return default_allocator;
+}
+
+} // namespace crown
+

+ 63 - 0
src/core/mem/MallocAllocator.h

@@ -0,0 +1,63 @@
+/*
+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"
+
+namespace crown
+{
+
+class MallocAllocator : public Allocator
+{
+public:
+
+				MallocAllocator();
+				~MallocAllocator();
+
+	void*		allocate(size_t size, size_t align = memory::DEFAULT_ALIGN);
+	void		deallocate(void* data);
+
+	size_t		allocated_size();
+	size_t		get_size(void* data);
+
+private:
+
+	//! Holds the number of bytes of an allocation
+	struct Header
+	{
+		size_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);
+
+	size_t		m_allocated_size;
+};
+
+} // namespace crown
+

+ 51 - 0
src/core/mem/Memory.h

@@ -0,0 +1,51 @@
+/*
+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 <stdint.h>
+#include <cassert>
+#include <cstdio>
+#include "Types.h"
+
+namespace crown
+{
+namespace memory
+{
+
+const uint		PADDING_VALUE	= 0xFFFFFFFFu;	//!< Value used to fill unused memory
+const size_t	DEFAULT_ALIGN	= 4;			//!< Default memory alignment in bytes
+
+//! Returns the pointer p aligned to the desired align
+inline void* align(void* p, size_t align)
+{
+	uintptr_t ptr = (uintptr_t)p;
+
+	return (void*)(ptr + (align - ptr % align));
+}
+
+} // namespace memory
+} // namespace crown
+