Ver código fonte

Create a function "SQSharedState::CallDelayedReleaseHooks(SQVM *vm, int count)" to manage the delayed release hooks, call then on first in first out basis, modify userdata release to also join delayed release hooks.
Added a function to sqvector to remove x elements from it's begining.

mingodad 13 anos atrás
pai
commit
aaa9e0b2df
6 arquivos alterados com 38 adições e 14 exclusões
  1. 1 0
      squirrel/sqclass.h
  2. 12 0
      squirrel/sqstate.cpp
  3. 2 0
      squirrel/sqstate.h
  4. 10 3
      squirrel/squserdata.h
  5. 10 0
      squirrel/squtils.h
  6. 3 11
      squirrel/sqvm.cpp

+ 1 - 0
squirrel/sqclass.h

@@ -137,6 +137,7 @@ public:
 		    SQDelayedReleseHook dh;
 		    dh.hook = _hook;
 		    dh.ptr = _userpointer;
+		    dh.size = 0;
 		    _sharedstate->_delayed_release_hook.push_back(dh);
 		    //_hook(_userpointer,0);
         }

+ 12 - 0
squirrel/sqstate.cpp

@@ -227,6 +227,18 @@ SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name)
 	return -1;
 }
 
+void SQSharedState::CallDelayedReleaseHooks(SQVM *vm, int count)
+{
+    if(_delayed_release_hook.size()){
+        if(count == 0) count =  _delayed_release_hook.size();
+        for(SQInteger i=0; i < count; ++i){
+            SQDelayedReleseHook &dh = _delayed_release_hook[i];
+            dh.hook(dh.ptr, dh.size, vm);
+        }
+        _delayed_release_hook.removeFromBegining(count);
+    }
+}
+
 #ifndef NO_GARBAGE_COLLECTOR
 
 void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain)

+ 2 - 0
squirrel/sqstate.h

@@ -63,6 +63,7 @@ struct SQObjectPtr;
 struct SQDelayedReleseHook {
     SQRELEASEHOOK hook;
     SQUserPointer ptr;
+    SQInteger size;
 };
 
 struct SQSharedState
@@ -92,6 +93,7 @@ public:
 	SQCollectable *_gc_chain;
 #endif
     sqvector<SQDelayedReleseHook> _delayed_release_hook;
+    void CallDelayedReleaseHooks(SQVM *vm, int count=0);
 	SQObjectPtr _root_vm;
 	SQObjectPtr _table_default_delegate;
 	static SQRegFunction _table_default_delegate_funcz[];

+ 10 - 3
squirrel/squserdata.h

@@ -24,13 +24,20 @@ struct SQUserData : SQDelegable
 	SQObjectType GetType(){ return OT_USERDATA;}
 #endif
 	void Release() {
-		if (_hook) _hook((SQUserPointer)sq_aligning(this + 1),_size, 0);
+		if (_hook) {
+		    SQDelayedReleseHook dh;
+		    dh.hook = _hook;
+		    dh.ptr = (SQUserPointer)sq_aligning(this + 1);
+		    dh.size = _size;
+		    _sharedstate->_delayed_release_hook.push_back(dh);
+		    //_hook((SQUserPointer)sq_aligning(this + 1),_size, 0);
+		}
 		SQInteger tsize = _size;
 		this->~SQUserData();
 		SQ_FREE(this, sq_aligning(sizeof(SQUserData)) + tsize);
 	}
-	
-		
+
+
 	SQInteger _size;
 	SQRELEASEHOOK _hook;
 	SQUserPointer _typetag;

+ 10 - 0
squirrel/squtils.h

@@ -98,6 +98,16 @@ public:
 		}
 		_size--;
 	}
+	void removeFromBegining(SQUnsignedInteger count)
+	{
+	    if(count <= _size){
+	        for(SQUnsignedInteger i=0; i < count; ++i) _vals[i].~T();
+            if(count < (_size - 1)) {
+                memmove(&_vals[0], &_vals[count], sizeof(T) * (_size - count));
+            }
+            _size -= count;
+	    }
+	}
 	SQUnsignedInteger capacity() { return _allocated; }
 	inline T &back() const { return _vals[_size - 1]; }
 	inline T& operator[](SQUnsignedInteger pos) const{ return _vals[pos]; }

+ 3 - 11
squirrel/sqvm.cpp

@@ -125,11 +125,7 @@ SQVM::SQVM(SQSharedState *ss)
 
 void SQVM::Finalize()
 {
-    while(_sharedstate->_delayed_release_hook.size()){
-        SQDelayedReleseHook &dh = _sharedstate->_delayed_release_hook.back();
-        dh.hook(dh.ptr, 0, this);
-        _sharedstate->_delayed_release_hook.pop_back();
-    }
+    _sharedstate->CallDelayedReleaseHooks(this);
 	if(_openouters) CloseOuters(&_stack._vals[0]);
 	_roottable.Null();
 	_lasterror.Null();
@@ -735,11 +731,7 @@ exception_restore:
 					switch (type(clo)) {
 					case OT_CLOSURE:
 						_GUARD(StartCall(_closure(clo), sarg0, arg3, _stackbase+arg2, false));
-                        if(_sharedstate->_delayed_release_hook.size()){
-                            SQDelayedReleseHook &dh = _sharedstate->_delayed_release_hook.back();
-                            dh.hook(dh.ptr, 0, this);
-                            _sharedstate->_delayed_release_hook.pop_back();
-                        }
+						_sharedstate->CallDelayedReleaseHooks(this);
 						continue;
 					case OT_NATIVECLOSURE: {
 						bool suspend;
@@ -755,7 +747,7 @@ exception_restore:
 						if(sarg0 != -1) {
 							STK(arg0) = clo;
 						}
-										   }
+                    }
 						continue;
 					case OT_CLASS:{
 						SQObjectPtr inst;