Browse Source

Some slightly scary GC tweaks + bbGC::malloc now always returns 8 byte aligned mem for asm.js (and probably more) fixes.

Mark Sibly 7 years ago
parent
commit
90e9ac3c03

+ 2 - 2
modules/monkey/native/bbarray.h

@@ -64,7 +64,7 @@ template<class T,int D> struct bbArray{
 			
 		if( !sizes[D-1] ) return;
 			
-		bbGCNode *p=bbGC::alloc( sizeof( Rep )+sizes[D-1]*sizeof(T) );
+		void *p=bbGC::malloc( sizeof( Rep )+sizes[D-1]*sizeof(T) );
 	
 		_rep=new( p ) Rep( sizes );
 			
@@ -78,7 +78,7 @@ template<class T,int D> struct bbArray{
 			
 		if( !sizes[D-1] ) return;
 			
-		bbGCNode *p=bbGC::alloc( sizeof( Rep )+sizes[D-1]*sizeof(T) );
+		void *p=bbGC::malloc( sizeof( Rep )+sizes[D-1]*sizeof(T) );
 			
 		_rep=new( p ) Rep( sizes );
 			

+ 13 - 27
modules/monkey/native/bbgc.cpp

@@ -241,23 +241,15 @@ namespace bbGC{
 		printf( "Warning! bbGC::release() - node not found!\n" );
 	}
 	
+	//need to return 8 byte aligned memory!
+	//
 	void *malloc( size_t size ){
 	
-		size=(size+sizeof(size_t)+7)&~7;
+//		size=(size+sizeof(size_t)+7)&~7;
+		size=( size+8+7 ) & ~7;
 		
 		memused+=size;
 		
-		/*
-		if( size<256 && pools[size>>3] ){
-			void *p=pools[size>>3];
-			pools[size>>3]=*(void**)p;
-			allocedBytes+=size;
-			size_t *q=(size_t*)p;
-			*q++=size;
-			return q;
-		}
-		*/
-		
 		if( !suspended ){
 
 			if( allocedBytes+size>=trigger ){
@@ -302,9 +294,13 @@ namespace bbGC{
 		}
 		
 		allocedBytes+=size;
+		
 		size_t *q=(size_t*)p;
-		*q++=size;
+		
+		if( sizeof(size_t)==4 ) ++q;
 
+		*q++=size;
+		
 		return q;
 	}
 	
@@ -323,9 +319,11 @@ namespace bbGC{
 		
 		size_t size=*q;
 		
-		#ifndef NDEBUG
+		if( sizeof(size_t)==4 ) --q;
+		
+#ifndef NDEBUG
 		memset( q,0xa5,size );
-		#endif
+#endif
 		
 		memused-=size;
 		
@@ -338,18 +336,6 @@ namespace bbGC{
 		}
 	}
 
-	bbGCNode *alloc( size_t size ){
-
-		bbGCNode *p=(bbGCNode*)bbGC::malloc( size );
-		
-		*((void**)p)=(void*)0xcafebabe;
-		
-		p->state=0;
-		p->flags=0;
-		
-		return p;
-	}
-	
 	void collect(){
 	
 		if( !inited ) return;

+ 3 - 1
modules/monkey/native/bbgc.h

@@ -61,7 +61,7 @@ namespace bbGC{
 
 	void collect();
 
-	bbGCNode *alloc( size_t size );
+//	bbGCNode *alloc( size_t size );
 }
 
 struct bbGCNode{
@@ -204,6 +204,8 @@ namespace bbGC{
 	inline void beginCtor( bbGCNode *p ){
 		p->succ=currentFiber->ctoring;
 		currentFiber->ctoring=p;
+		p->state=0;
+		p->flags=0;
 	}
 	
 	inline void endCtor( bbGCNode *p ){

+ 4 - 1
modules/monkey/native/bbobject.h

@@ -11,6 +11,7 @@ struct bbObject : public bbGCNode{
 	typedef bbObject *bb_object_type;
 
 	bbObject(){
+	
 		bbGC::beginCtor( this );
 	}
 	
@@ -23,12 +24,14 @@ struct bbObject : public bbGCNode{
 	virtual const char *typeName()const;
 	
 	void *operator new( size_t size ){
-		return bbGC::alloc( size );
+	
+		return bbGC::malloc( size );
 	}
 	
 	//NOTE! We need this in case ctor throws an exception. delete never otherwise called...
 	//
 	void operator delete( void *p ){
+	
 		bbGC::endCtor( (bbObject*)(p) );
 	}
 };