| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #ifndef BLITZ_GC_H
- #define BLITZ_GC_H
- #include "blitz_types.h"
- #ifdef __cplusplus
- extern "C"{
- #endif
- #define BBGC_MANYREFS 0x40000000
- //for bbGCSetMode
- #define BBGC_AUTOMATIC 1
- #define BBGC_MANUAL 2
- #define BBGC_AGGRESSIVE -1
- //for bbGCSetDebug
- #define BBGC_NODEBUG 0
- #define BBGC_STDOUTDEBUG 1
- //for bbGCAlloc
- #define BBGC_ATOMIC 1
- #define BBGC_FINALIZE 2
- //Probably shouldn't be here...
- #if __ppc__
- #define BBGC_NUM_ROOTREGS 19
- #else
- #define BBGC_NUM_ROOTREGS 4
- #endif
- void* bbGCRootRegs( void *p );
- void bbGCStartup();
- void bbGCSetMode( int mode );
- void bbGCSetDebug( int debug );
- void* bbGCMalloc( int size,int flags );
- BBObject* bbGCAllocObject( int size,BBClass *clas,int flags );
- int bbGCValidate( void *p );
- int bbGCMemAlloced();
- int bbGCCollect();
- void bbGCSuspend();
- void bbGCResume();
- void bbGCRetain( BBObject *p );
- void bbGCRelease( BBObject *p );
- // BBRETAIN/BBRELEASE should be used to prevent an object from garbage collection.
- //
- // This is mainly of use if an object is being stored outside of BlitzMax's 'sight' - say, in a C++ table.
- //
- // You can also use bbGCRetain/bbGCRelease functions above if necessary - MACROS are just faster.
- // For ref counting GC...
- //
- #ifdef BB_GC_RC
- #define BBRETAIN(X) {++(X)->refs;}
- #define BBRELEASE(X) {if( !--(X)->refs ) bbGCFree(X);}
- #endif
- // For Mark Sibly GC...
- //
- #ifdef BB_GC_MS
- #define BBRETAIN(X) bbGCRetain( ((BBObject*)(X)) );
- #define BBRELEASE(X) bbGCRelease( ((BBObject*)(X)) );
- #endif
- // For BDW GC...
- //
- #ifdef BB_GC_BDW
- #define BBRETAIN(X) {}
- #define BBRELEASE(X) {}
- #endif
- // Internal use only
- #ifdef BB_GC_RC
- void bbGCFree( BBObject *p ); //called when refs==0 - MAY be eligble for GC
- void bbGCDeallocObject( BBObject *p,int size ); //called after destruction - Sayonara!
- #define BBINCREFS(X) {++(X)->refs;}
- #define BBDECREFS(X) {if( !--(X)->refs ) bbGCFree(X);}
- #else
- #define BBINCREFS(X) {}
- #define BBDECREFS(X) {}
- #endif
- #ifdef __cplusplus
- }
- #endif
- #endif
|