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

Allocator implemented in BitMessage, FIX: deallocate memory in BitMessage cause invalid pointer error

mikymod 13 лет назад
Родитель
Сommit
cb49e8baa9
4 измененных файлов с 65 добавлено и 48 удалено
  1. 19 9
      src/network/BitMessage.cpp
  2. 6 3
      src/network/BitMessage.h
  3. 3 3
      tests/allocators.cpp
  4. 37 33
      tests/messages.cpp

+ 19 - 9
src/network/BitMessage.cpp

@@ -8,25 +8,31 @@ namespace crown
 namespace network
 {
   
-BitMessage::BitMessage() : 
+BitMessage::BitMessage(Allocator& allocator) : 
 	w_data(NULL), 
 	r_data(NULL), 
 	max_size(0), 
 	cur_size(0), 
 	write_bit(0), 
 	read_count(0), 
-	read_bit(0)
+	read_bit(0),
+	m_allocator(&allocator)
 {
-  
 }
 
 //---------------------------------------------------------------------------------------------
 
 BitMessage::~BitMessage()
-{
-  
+{/*
+  if (w_data)
+  {
+		m_allocator->deallocate((void*)w_data);
+  }
+  if (r_data)
+  {
+		m_allocator->deallocate((void*)r_data);
+  }*/
 }
-
 //---------------------------------------------------------------------------------------------
 
 uint8_t* BitMessage::get_byte_space(int32_t len)
@@ -73,8 +79,10 @@ bool BitMessage::check_overflow(int32_t num_bits)
 
 //---------------------------------------------------------------------------------------------
 
-void BitMessage::init(uint8_t *data, int32_t len)
+void BitMessage::init_in_w(int32_t len)
 {
+	uint8_t* data = (uint8_t*)m_allocator->allocate(len);
+	
 	w_data = data;
 	r_data = data;
 	max_size = len;
@@ -82,8 +90,10 @@ void BitMessage::init(uint8_t *data, int32_t len)
 
 //---------------------------------------------------------------------------------------------
 
-void BitMessage::init(const uint8_t *data, int32_t len)
+void BitMessage::init_in_r(int32_t len)
 {
+  	const uint8_t* data = (const uint8_t*)m_allocator->allocate(len);
+
 	w_data = NULL;
 	r_data = data;
 	max_size = len;
@@ -420,7 +430,7 @@ void BitMessage::write_string(const char* s, int32_t max_len, bool make_7_bit)
 		uint8_t* data_ptr;
 		const uint8_t* byte_ptr;
 		
-		// calculate s length
+		// calculates length
 		for (l = 0; s[l]; l++) {}
 		
 		if (max_len >= 0 && l >= max_len) 

+ 6 - 3
src/network/BitMessage.h

@@ -2,6 +2,7 @@
 
 #include "Types.h"
 #include "OS.h"
+#include "Allocator.h"
 #include "Vec3.h"
 
 namespace crown
@@ -15,11 +16,11 @@ namespace network
 	class BitMessage
 	{
 	public:
-						BitMessage();
+						BitMessage(Allocator& allocator);
 						~BitMessage();
 
-		void			init(uint8_t *data, int32_t len);
-		void			init(const uint8_t *data, int32_t len);
+		void			init_in_w(int32_t len);
+		void			init_in_r(int32_t len);
 		uint8_t*		get_data();										// get data for writing
 		const uint8_t*	get_data() const;								// get data for reading
 		int32_t			get_max_size() const;							// get the maximum message size
@@ -86,6 +87,8 @@ namespace network
 		mutable int32_t		read_count;									// number of bytes read so far
 		mutable int32_t		read_bit;									// number of bits read from the last read byte
 		bool 				overflowed;									// overflow flag
+		
+		Allocator*			m_allocator;								// memory allocator
 
 	private:
 	  

+ 3 - 3
tests/allocators.cpp

@@ -10,13 +10,13 @@ int main()
 	MallocAllocator malloc_allocator;
 
 	char* char_buffer = (char*)malloc_allocator.allocate(128);
-	assert(malloc_allocator.get_allocated_size() >= 128);
+	assert(malloc_allocator.allocated_size() >= 128);
 
-	printf("MallocAllocator::get_allocated_size(): %d", malloc_allocator.get_allocated_size());
+	printf("MallocAllocator::get_allocated_size(): %d\n", malloc_allocator.allocated_size());
 
 	malloc_allocator.deallocate(char_buffer);
 
-	printf("MallocAllocator::get_allocated_size(): %d", malloc_allocator.get_allocated_size());
+	printf("MallocAllocator::get_allocated_size(): %d\n", malloc_allocator.allocated_size());
 	//assert(malloc_allocator.get_allocated_size() == 0);
 }
 

+ 37 - 33
tests/messages.cpp

@@ -3,6 +3,7 @@
 #include "Vec3.h"
 #include "OS.h"
 #include "BitMessage.h"
+#include "MallocAllocator.h"
 
 using namespace crown;
 
@@ -13,12 +14,12 @@ void test_int8()
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
 	
-  	network::BitMessage m = network::BitMessage();
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
 	
-	uint8_t tmp[4];
 	int8_t res;
 	
-	m.init(tmp, 4);
+	m.init_in_w(4);
 	m.begin_writing();
 	m.write_int8(-56);
 	bits_written = m.get_num_bits_written();
@@ -48,12 +49,12 @@ void test_uint8()
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
 	
-  	network::BitMessage m = network::BitMessage();
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
 
-	uint8_t tmp[4];
 	uint8_t res;
 	
-	m.init(tmp, 4);
+	m.init_in_w(4);
 	m.begin_writing();
 	m.write_uint8(255);
 	bits_written = m.get_num_bits_written();
@@ -82,12 +83,12 @@ void test_int16()
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
 	
-  	network::BitMessage m = network::BitMessage();  
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);  
 	
-	uint8_t tmp[4];
 	int16_t res;
 	
-	m.init(tmp, 4);
+	m.init_in_w(4);
 	m.write_int16(-5555);
 	bits_written = m.get_num_bits_written();
 	rem_write_bits = m.get_remaining_write_bits();
@@ -113,13 +114,13 @@ void test_uint16()
 	uint32_t rem_write_bits;
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
-	
-  	network::BitMessage m = network::BitMessage();
 
-	uint8_t tmp[4];
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
+
 	uint16_t res;
 	
-	m.init(tmp, 4);
+	m.init_in_w(4);
 	m.write_uint16(5555);
 	bits_written = m.get_num_bits_written();
 	rem_write_bits = m.get_remaining_write_bits();
@@ -145,13 +146,13 @@ void test_int32()
 	uint32_t rem_write_bits;
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
+
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
 	
-  	network::BitMessage m = network::BitMessage();
-	
-	uint8_t tmp[4];
 	int32_t res;
 	
-	m.init(tmp, 4);
+	m.init_in_w(4);
 	m.write_int32(4000000);
 	bits_written = m.get_num_bits_written();
 	rem_write_bits = m.get_remaining_write_bits();
@@ -178,13 +179,13 @@ void test_real()
 	uint32_t rem_write_bits;
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
-	
-  	network::BitMessage m = network::BitMessage();
 
-	uint8_t tmp[4];
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
+
 	real res;
 	
-	m.init(tmp, 4);
+	m.init_in_w(4);
 	m.write_real(4.5342f);
 	bits_written = m.get_num_bits_written();
 	rem_write_bits = m.get_remaining_write_bits();
@@ -212,15 +213,15 @@ void test_vec3()
 	uint32_t rem_write_bits;
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
-	
-  	network::BitMessage m = network::BitMessage();
+
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
 	
 	
-	uint8_t tmp[12];
 	Vec3 v(0.525f, 0.432f, 0.234f);
 	Vec3 res;
 	
-	m.init(tmp, 12);
+	m.init_in_w(12);
 	m.write_vec3(v);
 	bits_written = m.get_num_bits_written();
 	rem_write_bits = m.get_remaining_write_bits();
@@ -246,15 +247,16 @@ void test_string()
 	uint32_t rem_write_bits;
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
-	
-  	network::BitMessage m = network::BitMessage();
+
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
 	
 	uint8_t tmp[16];
 	char res[16];
 
 	char s[] = "test";
 	
-	m.init(tmp, 16);
+	m.init_in_w(16);
 
 	m.write_string(s, sizeof(s), true);
  	bits_written = m.get_num_bits_written();
@@ -282,13 +284,14 @@ void test_data()
 	uint32_t rem_write_bits;
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
-	
-  	network::BitMessage m = network::BitMessage();
+
+	MallocAllocator allocator;
+  	network::BitMessage m = network::BitMessage(allocator);
 	
 	uint8_t tmp[] = "test generic";
 	uint8_t res[16];
 	
-	m.init(tmp, 16);
+	m.init_in_w(16);
 	
 	m.write_data(tmp, 16);
  	bits_written = m.get_num_bits_written();
@@ -317,7 +320,8 @@ void test_net_address()
 	uint32_t bits_read;
 	uint32_t rem_read_bits; 
 	
-	network::BitMessage m = network::BitMessage();
+	MallocAllocator allocator;
+	network::BitMessage m = network::BitMessage(allocator);
 
 	uint8_t tmp[16];
 	
@@ -327,7 +331,7 @@ void test_net_address()
 	
 	addr.set(192, 168, 0, 1, 80);
 	
-	m.init(tmp, 16);
+	m.init_in_w(16);
 	m.write_ipv4addr(addr);
 	bits_written = m.get_num_bits_written();
 	rem_write_bits = m.get_remaining_write_bits();