[DEV] finish remove chaining for garbage collector

This commit is contained in:
Edouard DUPIN 2018-06-27 01:15:54 +02:00
parent 73000df2bb
commit bec51d5c0a
12 changed files with 34 additions and 39 deletions

View File

@ -13,11 +13,8 @@ namespace rabbit {
UserData(SQSharedState *ss) { UserData(SQSharedState *ss) {
_delegate = 0; _delegate = 0;
m_hook = NULL; m_hook = NULL;
INIT_CHAIN();
ADD_TO_CHAIN(&_ss(this)->_gc_chain, this);
} }
~UserData() { ~UserData() {
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);
SetDelegate(NULL); SetDelegate(NULL);
} }
static UserData* Create(SQSharedState *ss, SQInteger size) { static UserData* Create(SQSharedState *ss, SQInteger size) {

View File

@ -10,10 +10,11 @@
struct SQArray : public CHAINABLE_OBJ struct SQArray : public CHAINABLE_OBJ
{ {
private: private:
SQArray(SQSharedState *ss,SQInteger nsize){_values.resize(nsize); INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);} SQArray(SQSharedState *ss,SQInteger nsize) {
_values.resize(nsize);
}
~SQArray() ~SQArray()
{ {
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
} }
public: public:
static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){ static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){

View File

@ -32,9 +32,6 @@ SQClass::SQClass(SQSharedState *ss,SQClass *base)
} }
_members = base?base->_members->Clone() : SQTable::Create(ss,0); _members = base?base->_members->Clone() : SQTable::Create(ss,0);
__ObjAddRef(_members); __ObjAddRef(_members);
INIT_CHAIN();
ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
} }
void SQClass::Finalize() { void SQClass::Finalize() {
@ -50,7 +47,6 @@ void SQClass::Finalize() {
SQClass::~SQClass() SQClass::~SQClass()
{ {
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
Finalize(); Finalize();
} }
@ -154,8 +150,6 @@ void SQInstance::Init(SQSharedState *ss)
_hook = NULL; _hook = NULL;
__ObjAddRef(_class); __ObjAddRef(_class);
_delegate = _class->_members; _delegate = _class->_members;
INIT_CHAIN();
ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
} }
SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize) SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize)
@ -189,7 +183,6 @@ void SQInstance::Finalize()
SQInstance::~SQInstance() SQInstance::~SQInstance()
{ {
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
if(_class){ Finalize(); } //if _class is null it was already finalized by the GC if(_class){ Finalize(); } //if _class is null it was already finalized by the GC
} }

View File

@ -30,7 +30,7 @@ typedef sqvector<SQClassMember> SQClassMemberVec;
#define _member_type(o) (_integer(o)&0xFF000000) #define _member_type(o) (_integer(o)&0xFF000000)
#define _member_idx(o) (_integer(o)&0x00FFFFFF) #define _member_idx(o) (_integer(o)&0x00FFFFFF)
struct SQClass : public CHAINABLE_OBJ struct SQClass : public SQRefCounted
{ {
SQClass(SQSharedState *ss,SQClass *base); SQClass(SQSharedState *ss,SQClass *base);
public: public:

View File

@ -11,10 +11,15 @@
struct SQFunctionProto; struct SQFunctionProto;
struct SQClass; struct SQClass;
struct SQClosure : public CHAINABLE_OBJ struct SQClosure : public SQRefCounted
{ {
private: private:
SQClosure(SQSharedState *ss,SQFunctionProto *func){_function = func; __ObjAddRef(_function); _base = NULL; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); _env = NULL; _root=NULL;} SQClosure(SQSharedState *ss,SQFunctionProto *func){
_function = func;
__ObjAddRef(_function); _base = NULL;
_env = NULL;
_root=NULL;
}
public: public:
static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func,SQWeakRef *root){ static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func,SQWeakRef *root){
SQInteger size = _CALC_CLOSURE_SIZE(func); SQInteger size = _CALC_CLOSURE_SIZE(func);
@ -66,11 +71,14 @@ public:
}; };
////////////////////////////////////////////// //////////////////////////////////////////////
struct SQOuter : public CHAINABLE_OBJ struct SQOuter : public SQRefCounted
{ {
private: private:
SQOuter(SQSharedState *ss, SQObjectPtr *outer){_valptr = outer; _next = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); } SQOuter(SQSharedState *ss, SQObjectPtr *outer){
_valptr = outer;
_next = NULL;
}
public: public:
static SQOuter *Create(SQSharedState *ss, SQObjectPtr *outer) static SQOuter *Create(SQSharedState *ss, SQObjectPtr *outer)
@ -79,7 +87,9 @@ public:
new (nc) SQOuter(ss, outer); new (nc) SQOuter(ss, outer);
return nc; return nc;
} }
~SQOuter() { REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); } ~SQOuter() {
}
void Release() void Release()
{ {
@ -94,11 +104,15 @@ public:
}; };
////////////////////////////////////////////// //////////////////////////////////////////////
struct SQGenerator : public CHAINABLE_OBJ struct SQGenerator : public SQRefCounted
{ {
enum SQGeneratorState{eRunning,eSuspended,eDead}; enum SQGeneratorState{eRunning,eSuspended,eDead};
private: private:
SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=NULL;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);} SQGenerator(SQSharedState *ss,SQClosure *closure){
_closure=closure;
_state=eRunning;
_ci._generator=NULL;
}
public: public:
static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){ static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator)); SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
@ -107,7 +121,7 @@ public:
} }
~SQGenerator() ~SQGenerator()
{ {
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
} }
void Kill(){ void Kill(){
_state=eDead; _state=eDead;
@ -128,10 +142,13 @@ public:
#define _CALC_NATVIVECLOSURE_SIZE(noutervalues) (sizeof(SQNativeClosure) + (noutervalues*sizeof(SQObjectPtr))) #define _CALC_NATVIVECLOSURE_SIZE(noutervalues) (sizeof(SQNativeClosure) + (noutervalues*sizeof(SQObjectPtr)))
struct SQNativeClosure : public CHAINABLE_OBJ struct SQNativeClosure : public SQRefCounted
{ {
private: private:
SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); _env = NULL;} SQNativeClosure(SQSharedState *ss,SQFUNCTION func){
_function=func;
_env = NULL;
}
public: public:
static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func,SQInteger nouters) static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func,SQInteger nouters)
{ {
@ -157,7 +174,6 @@ public:
~SQNativeClosure() ~SQNativeClosure()
{ {
__ObjRelease(_env); __ObjRelease(_env);
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
} }
void Release(){ void Release(){
SQInteger size = _CALC_NATVIVECLOSURE_SIZE(_noutervalues); SQInteger size = _CALC_NATVIVECLOSURE_SIZE(_noutervalues);

View File

@ -64,7 +64,7 @@ typedef sqvector<SQLineInfo> SQLineInfoVec;
+(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger))) +(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger)))
struct SQFunctionProto : public CHAINABLE_OBJ struct SQFunctionProto : public SQRefCounted
{ {
private: private:
SQFunctionProto(SQSharedState *ss); SQFunctionProto(SQSharedState *ss);

View File

@ -276,7 +276,6 @@ SQClosure::~SQClosure()
__ObjRelease(_root); __ObjRelease(_root);
__ObjRelease(_env); __ObjRelease(_env);
__ObjRelease(_base); __ObjRelease(_base);
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
} }
#define _CHECK_IO(exp) { if(!exp)return false; } #define _CHECK_IO(exp) { if(!exp)return false; }
@ -401,12 +400,10 @@ SQFunctionProto::SQFunctionProto(SQSharedState *ss)
{ {
_stacksize=0; _stacksize=0;
_bgenerator=false; _bgenerator=false;
INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
} }
SQFunctionProto::~SQFunctionProto() SQFunctionProto::~SQFunctionProto()
{ {
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
} }
bool SQFunctionProto::Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write) bool SQFunctionProto::Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write)

View File

@ -312,12 +312,8 @@ inline void _Swap(SQObject &a,SQObject &b)
b._unVal = unOldVal; b._unVal = unOldVal;
} }
#define ADD_TO_CHAIN(chain,obj) ((void)0)
#define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
#define CHAINABLE_OBJ SQRefCounted
#define INIT_CHAIN() ((void)0)
struct SQDelegable : public CHAINABLE_OBJ { struct SQDelegable : public SQRefCounted {
bool SetDelegate(SQTable *m); bool SetDelegate(SQTable *m);
virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res); virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
SQTable *_delegate; SQTable *_delegate;

View File

@ -19,8 +19,6 @@ SQTable::SQTable(SQSharedState *ss,SQInteger nInitialSize)
AllocNodes(pow2size); AllocNodes(pow2size);
_usednodes = 0; _usednodes = 0;
_delegate = NULL; _delegate = NULL;
INIT_CHAIN();
ADD_TO_CHAIN(&_sharedstate->_gc_chain,this);
} }
void SQTable::Remove(const SQObjectPtr &key) void SQTable::Remove(const SQObjectPtr &key)

View File

@ -61,7 +61,6 @@ public:
~SQTable() ~SQTable()
{ {
SetDelegate(NULL); SetDelegate(NULL);
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode(); for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode();
SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode)); SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode));
} }

View File

@ -129,7 +129,6 @@ SQVM::SQVM(SQSharedState *ss)
_openouters = NULL; _openouters = NULL;
ci = NULL; ci = NULL;
_releasehook = NULL; _releasehook = NULL;
INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
} }
void SQVM::Finalize() void SQVM::Finalize()
@ -152,7 +151,6 @@ void SQVM::Finalize()
SQVM::~SQVM() SQVM::~SQVM()
{ {
Finalize(); Finalize();
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
} }
bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &dest) bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &dest)

View File

@ -37,7 +37,7 @@ struct SQExceptionTrap{
typedef sqvector<SQExceptionTrap> ExceptionsTraps; typedef sqvector<SQExceptionTrap> ExceptionsTraps;
struct SQVM : public CHAINABLE_OBJ struct SQVM : public SQRefCounted
{ {
struct CallInfo{ struct CallInfo{
//CallInfo() { _generator = NULL;} //CallInfo() { _generator = NULL;}