2
0
ncannasse 7 жил өмнө
parent
commit
02b775e414
1 өөрчлөгдсөн 19 нэмэгдсэн , 22 устгасан
  1. 19 22
      src/alloc.c

+ 19 - 22
src/alloc.c

@@ -82,6 +82,7 @@ static inline unsigned int TRAILING_ZEROES( unsigned int x ) {
 
 #ifdef HL_DEBUG
 #	define GC_DEBUG
+#	define GC_MEMCHK
 #endif
 
 #define out_of_memory(reason)		hl_fatal("Out of Memory (" reason ")")
@@ -561,42 +562,29 @@ static void *gc_alloc_gen( int size, int flags, int *allocated ) {
 
 static void gc_check_mark();
 
-//#define HL_BUMP_ALLOC
-
-#ifdef HL_BUMP_ALLOC
-static unsigned char *alloc_all = NULL;
-static unsigned char *alloc_end = NULL;
-#endif
-
 void *hl_gc_alloc_gen( hl_type *t, int size, int flags ) {
 	void *ptr;
 	int time = 0;
 	int allocated = 0;
-#ifdef HL_BUMP_ALLOC
-	if( !alloc_all ) {
-		int tot = 3<<29;
-		alloc_all = gc_alloc_page_memory(tot);
-		if( !alloc_all ) hl_fatal("Failed to allocate bump memory");
-		alloc_end = alloc_all + tot;
-	}
-	ptr = alloc_all;
-	alloc_all += size;
-	if( alloc_all > alloc_end ) out_of_memory("bump");
-#else
 	gc_check_mark();
+#	ifdef GC_MEMCHK
+	size += HL_WSIZE;
+#	endif
 	if( gc_flags & GC_PROFILE ) time = TIMESTAMP();
 	ptr = gc_alloc_gen(size, flags, &allocated);
 	if( gc_flags & GC_PROFILE ) gc_stats.alloc_time += TIMESTAMP() - time;
 #	ifdef GC_DEBUG
 	memset(ptr,0xCD,allocated);
 #	endif
-#endif
 	if( flags & MEM_ZERO )
 		MZERO(ptr,allocated);
 	else if( MEM_HAS_PTR(flags) && allocated != size )
 		MZERO((char*)ptr+size,allocated-size); // erase possible pointers after data
 	if( (gc_flags & GC_TRACK) && gc_track_callback )
 		((void (*)(hl_type *,int,int,void*))gc_track_callback)(t,size,flags,ptr);
+#	ifdef GC_MEMCHK
+	memset((char*)ptr+(allocated - HL_WSIZE),0xEE,HL_WSIZE);
+#	endif
 	return ptr;
 }
 
@@ -719,10 +707,19 @@ static void gc_clear_unmarked_mem() {
 			int bid;
 			for(bid=p->first_block;bid<p->max_blocks;bid++) {
 				if( p->sizes && !p->sizes[bid] ) continue;
+				int size = p->sizes ? p->sizes[bid] * p->block_size : p->block_size;
+				unsigned char *ptr = (unsigned char*)p + bid * p->block_size;
+				if( bid * p->block_size + size > p->page_size ) hl_fatal("invalid block size");
+#				ifdef GC_MEMCHK
+				int_val eob = *(int_val*)(ptr + size - HL_WSIZE);
+#				ifdef HL_64
+				if( eob != 0xEEEEEEEEEEEEEEEE && eob != 0xDDDDDDDDDDDDDDDD )
+#				else
+				if( eob != 0xEEEEEEEE && eob != 0xDDDDDDDD )
+#				endif
+					hl_fatal("Block written out of bounds");
+#				endif
 				if( (p->bmp[bid>>3] & (1<<(bid&7))) == 0 ) {
-					int size = p->sizes ? p->sizes[bid] * p->block_size : p->block_size;
-					unsigned char *ptr = (unsigned char*)p + bid * p->block_size;
-					if( bid * p->block_size + size > p->page_size ) hl_fatal("invalid block size");
 					memset(ptr,0xDD,size);
 					if( p->sizes ) p->sizes[bid] = 0;
 				}