diff options
author | Melanie | 2009-08-06 22:03:20 +0100 |
---|---|---|
committer | Melanie | 2009-08-06 22:03:20 +0100 |
commit | 91f6898b26caa8f74533dbd90478cf4103251abe (patch) | |
tree | 0ee8d1b94c3f0667d32cbf56043fd021fc8d8b73 /OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |
parent | Merge branch 'master' of ssh://melanie@opensimulator.org/var/git/opensim (diff) | |
download | opensim-SC_OLD-91f6898b26caa8f74533dbd90478cf4103251abe.zip opensim-SC_OLD-91f6898b26caa8f74533dbd90478cf4103251abe.tar.gz opensim-SC_OLD-91f6898b26caa8f74533dbd90478cf4103251abe.tar.bz2 opensim-SC_OLD-91f6898b26caa8f74533dbd90478cf4103251abe.tar.xz |
|From: James J Greensky <jame.j.greensky@intel.com>
|Date: Wed, 5 Aug 2009 09:51:52 -0700
|Subject: [PATCH] Closed two major memory leaks for scripted objects
|
|Two major memory leaks for the scripted objects were fixed
|- One leak had to do with remoting acrossing app domains. When a script and
| its controlling agent communicate across an application boundary, it calls
| functions on a stub proxy object that then invokes the remote method on
| the object in the other app domain. These stub objects (two for each script)
| were setup to have infinate lifetimes and were never being garbage collected.
|- The second leak was the result of adding a scene object part instance method
| to a scene event and never removing it. This cause the event's delegate list
| to maintain a link to that object which is then never freed as the scene event
| object is never destroyed.
Patch applied, please direct feedback to me. Possible issue: Longtime idle
scripts like vendors may fail.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index c7673c7..ff75e2f 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -272,6 +272,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
272 | instance.ClearQueue(); | 272 | instance.ClearQueue(); |
273 | instance.Stop(0); | 273 | instance.Stop(0); |
274 | 274 | ||
275 | // Release events, timer, etc | ||
276 | // | ||
277 | instance.DestroyScriptInstance(); | ||
278 | |||
275 | // Unload scripts and app domains | 279 | // Unload scripts and app domains |
276 | // Must be done explicitly because they have infinite | 280 | // Must be done explicitly because they have infinite |
277 | // lifetime | 281 | // lifetime |
@@ -282,10 +286,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
282 | m_DomainScripts.Remove(instance.AppDomain); | 286 | m_DomainScripts.Remove(instance.AppDomain); |
283 | UnloadAppDomain(instance.AppDomain); | 287 | UnloadAppDomain(instance.AppDomain); |
284 | } | 288 | } |
285 | |||
286 | // Release events, timer, etc | ||
287 | // | ||
288 | instance.DestroyScriptInstance(); | ||
289 | } | 289 | } |
290 | m_Scripts.Clear(); | 290 | m_Scripts.Clear(); |
291 | m_PrimObjects.Clear(); | 291 | m_PrimObjects.Clear(); |
@@ -802,6 +802,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
802 | } | 802 | } |
803 | } | 803 | } |
804 | 804 | ||
805 | instance.RemoveState(); | ||
806 | instance.DestroyScriptInstance(); | ||
807 | |||
805 | m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); | 808 | m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); |
806 | if (m_DomainScripts[instance.AppDomain].Count == 0) | 809 | if (m_DomainScripts[instance.AppDomain].Count == 0) |
807 | { | 810 | { |
@@ -809,9 +812,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
809 | UnloadAppDomain(instance.AppDomain); | 812 | UnloadAppDomain(instance.AppDomain); |
810 | } | 813 | } |
811 | 814 | ||
812 | instance.RemoveState(); | ||
813 | instance.DestroyScriptInstance(); | ||
814 | |||
815 | instance = null; | 815 | instance = null; |
816 | 816 | ||
817 | ObjectRemoved handlerObjectRemoved = OnObjectRemoved; | 817 | ObjectRemoved handlerObjectRemoved = OnObjectRemoved; |