2
0
Эх сурвалжийг харах

Merge pull request #388 from bmx-ng/task/collectable-mem

MemAlloc now supports the notion of collectable memory.
Brucey 3 долоо хоног өмнө
parent
commit
7b60ec85f0

+ 3 - 3
bank.mod/bank.bmx

@@ -113,9 +113,9 @@ Type TBank
 		If size>_capacity
 			Local n:Size_T=_capacity*3/2
 			If n<size n=size
-			Local tmp:Byte Ptr=MemAlloc(n)
+			Local tmp:Byte Ptr=MemAlloc(n, True)
 			MemCopy tmp,_buf,_size
-			MemFree _buf
+			MemFree _buf, True
 			_capacity=n
 			_buf=tmp
 		EndIf
@@ -384,7 +384,7 @@ Type TBank
 	End Rem
 	Function Create:TBank( size:Size_T )
 		Local bank:TBank=New TBank
-		bank._buf=MemAlloc( size )
+		bank._buf=MemAlloc( size, True )
 		bank._size=size
 		bank._capacity=size
 		Return bank

+ 53 - 19
blitz.mod/blitz.bmx

@@ -370,6 +370,59 @@ bbdoc: Enables skipping leading whitespace in extended string to number conversi
 End Rem
 Const CHARSFORMAT_SKIPWHITESPACE:ULong = 1 Shl 8
 
+Extern
+	Function bbMemAllocCollectable:Byte Ptr(size:Size_T)="void * bbMemAllocCollectable(size_t)"
+	Function bbMemFreeCollectable(mem:Byte Ptr)="void bbMemFreeCollectable( void * )"
+	Function bbMemExtendCollectable:Byte Ptr(mem:Byte Ptr,size:Size_T,new_size:Size_T)="void * bbMemExtendCollectable(void *,size_t,size_t)"
+
+	Function bbMemAlloc:Byte Ptr(size:Size_T)="void * bbMemAlloc(size_t)"
+	Function bbMemFree(mem:Byte Ptr)="void bbMemFree( void * )"
+	Function bbMemExtend:Byte Ptr(mem:Byte Ptr,size:Size_T,new_size:Size_T)="void * bbMemExtend( void *,size_t,size_t )"
+End Extern
+
+Rem
+bbdoc: Allocates memory
+returns: A new block of memory @size bytes long
+about: Allocates a new block of memory @size bytes long. If @collectable is #False, the memory is not collectable and must be freed manually with #MemFree.
+Otherwise, the memory is collectable and can either be freed with #MemFree (with collectable set to #True) or will be automatically freed by the garbage collector.
+End Rem
+Function MemAlloc:Byte Ptr( size:Size_T, collectable:Int = False )
+	If collectable Then
+		Return bbMemAllocCollectable(size)
+	Else
+		Return bbMemAlloc(size)
+	End If
+End Function
+
+Rem
+bbdoc: Free allocated memory
+about: The memory specified by @mem must have been previously allocated by #MemAlloc or #MemExtend.
+Note: If the memory was allocated with #MemAlloc and @collectable is #True, @collectable must be #True when freeing the memory.
+End Rem
+Function MemFree( mem:Byte Ptr, collectable:Int = False )
+	If collectable Then
+		bbMemFreeCollectable(mem)
+	Else
+		bbMemFree(mem)
+	End If
+End Function
+
+Rem
+bbdoc: Extend a block of memory
+returns: A new block of memory @new_size bytes long
+about: An existing block of memory specified by @mem and @size is copied into a new block
+of memory @new_size bytes long. The existing block is released and the new block is returned.
+
+Use @collectable set to #True if the memory you are extending was allocated with #MemAlloc and @collectable is #True.
+End Rem
+Function MemExtend:Byte Ptr( mem:Byte Ptr,size:Size_T,new_size:Size_T, collectable:Int = False )
+	If collectable Then
+		Return bbMemExtendCollectable(mem, size, new_size)
+	Else
+		Return bbMemExtend(mem, size, new_size)
+	End If
+End Function
+
 Extern
 
 Rem
@@ -476,25 +529,6 @@ A millisecond is one thousandth of a second.
 End Rem
 Function MilliSecs:Int()="bbMilliSecs"
 
-Rem
-bbdoc: Allocate memory
-returns: A new block of memory @size bytes long
-End Rem
-Function MemAlloc:Byte Ptr( size:Size_T )="void* bbMemAlloc( size_t )"
-
-Rem
-bbdoc: Free allocated memory
-about: The memory specified by @mem must have been previously allocated by #MemAlloc or #MemExtend.
-End Rem
-Function MemFree( mem:Byte Ptr )="void bbMemFree( void * )"
-
-Rem
-bbdoc: Extend a block of memory
-returns: A new block of memory @new_size bytes long
-about: An existing block of memory specified by @mem and @size is copied into a new block
-of memory @new_size bytes long. The existing block is released and the new block is returned. 
-End Rem
-Function MemExtend:Byte Ptr( mem:Byte Ptr,size:Size_T,new_size:Size_T )="void* bbMemExtend( void *,size_t ,size_t )"
 
 Rem
 bbdoc: Clear a block of memory to 0

+ 18 - 0
blitz.mod/blitz_memory.c

@@ -4,6 +4,24 @@
 #define SIZEALIGN 16
 #define ALIGNMASK (SIZEALIGN-1)
 
+void *bbMemAllocCollectable(size_t size) {
+    void * p = GC_malloc_atomic(size);
+    return p;
+}
+
+void bbMemFreeCollectable(void *p) {
+    GC_free(p);
+}
+
+void *bbMemExtendCollectable( void *mem,size_t size,size_t new_size ){
+    void *p = bbMemAllocCollectable(new_size);
+    if (mem) {
+        bbMemCopy(p, mem, size);
+        bbMemFreeCollectable(mem);
+    }
+    return p;
+}
+
 void *bbMemAlloc(size_t size) {
     size_t totalSize = size + SIZEALIGN - 1 + sizeof(void*);
     void *p = malloc(totalSize);

+ 3 - 0
blitz.mod/blitz_memory.h

@@ -8,6 +8,9 @@
 extern "C"{
 #endif
 
+void *bbMemAllocCollectable(size_t size);
+void bbMemFreeCollectable( void *mem );
+void *bbMemExtendCollectable( void *mem,size_t size,size_t new_size );
 void*	bbMemAlloc( size_t );
 void		bbMemFree( void *mem );
 void*	bbMemExtend( void *mem,size_t size,size_t new_size );

+ 2 - 2
pixmap.mod/pixmap.bmx

@@ -75,7 +75,7 @@ Type TPixmap
 	
 	Method Delete()
 		If capacity>=0 
-			MemFree pixels
+			MemFree pixels, True
 		EndIf
 	End Method
 
@@ -225,7 +225,7 @@ Type TPixmap
 		pitch=(pitch+(align-1))/align*align
 		Local capacity:Size_T=pitch*height
 		Local pixmap:TPixmap=New TPixmap
-		pixmap.pixels=MemAlloc( capacity )
+		pixmap.pixels=MemAlloc( capacity, True )
 		pixmap.width=width
 		pixmap.height=height
 		pixmap.pitch=pitch