Explorar o código

Hiding the vector that holds delayed release hooks, add a function to add delayed release hooks, add a flag to prevent loops when actually doing the delayed release hooks calls.

mingodad %!s(int64=13) %!d(string=hai) anos
pai
achega
174267debe
Modificáronse 4 ficheiros con 18 adicións e 11 borrados
  1. 1 5
      squirrel/sqclass.h
  2. 13 0
      squirrel/sqstate.cpp
  3. 3 1
      squirrel/sqstate.h
  4. 1 5
      squirrel/squserdata.h

+ 1 - 5
squirrel/sqclass.h

@@ -134,11 +134,7 @@ public:
 	void Release() {
 	void Release() {
 		_uiRef++;
 		_uiRef++;
 		if (_hook) {
 		if (_hook) {
-		    SQDelayedReleseHook dh;
-		    dh.hook = _hook;
-		    dh.ptr = _userpointer;
-		    dh.size = 0;
-		    _sharedstate->_delayed_release_hook.push_back(dh);
+		    _sharedstate->AddDelayedReleaseHook(_hook, _userpointer, 0);
 		    //_hook(_userpointer,0);
 		    //_hook(_userpointer,0);
         }
         }
 		_uiRef--;
 		_uiRef--;

+ 13 - 0
squirrel/sqstate.cpp

@@ -25,6 +25,7 @@ SQSharedState::SQSharedState()
 	_errorfunc = NULL;
 	_errorfunc = NULL;
 	_debuginfo = false;
 	_debuginfo = false;
 	_notifyallexceptions = false;
 	_notifyallexceptions = false;
+	_already_in_CallDelayedReleaseHooks = false;
 }
 }
 
 
 #define newsysstring(s) {	\
 #define newsysstring(s) {	\
@@ -227,15 +228,27 @@ SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name)
 	return -1;
 	return -1;
 }
 }
 
 
+void SQSharedState::AddDelayedReleaseHook(SQRELEASEHOOK hook, SQUserPointer ptr, SQInteger size)
+{
+    SQDelayedReleseHook dh;
+    dh.hook = hook;
+    dh.ptr = ptr;
+    dh.size = size;
+    _delayed_release_hook.push_back(dh);
+}
+
 void SQSharedState::CallDelayedReleaseHooks(SQVM *vm, int count)
 void SQSharedState::CallDelayedReleaseHooks(SQVM *vm, int count)
 {
 {
+    if(_already_in_CallDelayedReleaseHooks) return;
     if(_delayed_release_hook.size()){
     if(_delayed_release_hook.size()){
+        _already_in_CallDelayedReleaseHooks = true;
         if(count == 0) count =  _delayed_release_hook.size();
         if(count == 0) count =  _delayed_release_hook.size();
         for(SQInteger i=0; i < count; ++i){
         for(SQInteger i=0; i < count; ++i){
             SQDelayedReleseHook &dh = _delayed_release_hook[i];
             SQDelayedReleseHook &dh = _delayed_release_hook[i];
             dh.hook(dh.ptr, dh.size, vm);
             dh.hook(dh.ptr, dh.size, vm);
         }
         }
         _delayed_release_hook.removeFromBegining(count);
         _delayed_release_hook.removeFromBegining(count);
+        _already_in_CallDelayedReleaseHooks = false;
     }
     }
 }
 }
 
 

+ 3 - 1
squirrel/sqstate.h

@@ -92,7 +92,7 @@ public:
 #ifndef NO_GARBAGE_COLLECTOR
 #ifndef NO_GARBAGE_COLLECTOR
 	SQCollectable *_gc_chain;
 	SQCollectable *_gc_chain;
 #endif
 #endif
-    sqvector<SQDelayedReleseHook> _delayed_release_hook;
+    void AddDelayedReleaseHook(SQRELEASEHOOK hook, SQUserPointer ptr, SQInteger size);
     void CallDelayedReleaseHooks(SQVM *vm, int count=0);
     void CallDelayedReleaseHooks(SQVM *vm, int count=0);
 	SQObjectPtr _root_vm;
 	SQObjectPtr _root_vm;
 	SQObjectPtr _table_default_delegate;
 	SQObjectPtr _table_default_delegate;
@@ -122,6 +122,8 @@ public:
 	bool _debuginfo;
 	bool _debuginfo;
 	bool _notifyallexceptions;
 	bool _notifyallexceptions;
 private:
 private:
+    bool _already_in_CallDelayedReleaseHooks;
+    sqvector<SQDelayedReleseHook> _delayed_release_hook;
 	SQChar *_scratchpad;
 	SQChar *_scratchpad;
 	SQInteger _scratchpadsize;
 	SQInteger _scratchpadsize;
 };
 };

+ 1 - 5
squirrel/squserdata.h

@@ -25,11 +25,7 @@ struct SQUserData : SQDelegable
 #endif
 #endif
 	void Release() {
 	void Release() {
 		if (_hook) {
 		if (_hook) {
-		    SQDelayedReleseHook dh;
-		    dh.hook = _hook;
-		    dh.ptr = (SQUserPointer)sq_aligning(this + 1);
-		    dh.size = _size;
-		    _sharedstate->_delayed_release_hook.push_back(dh);
+		    _sharedstate->AddDelayedReleaseHook(_hook, (SQUserPointer)sq_aligning(this + 1), _size);
 		    //_hook((SQUserPointer)sq_aligning(this + 1),_size, 0);
 		    //_hook((SQUserPointer)sq_aligning(this + 1),_size, 0);
 		}
 		}
 		SQInteger tsize = _size;
 		SQInteger tsize = _size;