* Unregister Mono.Addins event handlers in PluginLoader.Dispose() and always handle PluginLoader with the using pattern. This freed up 121,634,796 bytes on my system

* Avoid allocating an Action<IClientAPI> object every round of the OutgoingPacketHandler
* Removed unnecessary semi-colon endings from OpenSim.ini.example [InterestManagement] section
0.6.8-post-fixes
John Hurliman 2009-10-23 13:14:29 -07:00
parent c749cf0061
commit a41cd1d069
7 changed files with 44 additions and 29 deletions

View File

@ -119,14 +119,15 @@ namespace OpenSim.Data
PluginLoaderParamFactory<T>(connect, out pluginInitialiser, out extensionPointPath); PluginLoaderParamFactory<T>(connect, out pluginInitialiser, out extensionPointPath);
PluginLoader<T> loader = new PluginLoader<T>(pluginInitialiser); using (PluginLoader<T> loader = new PluginLoader<T>(pluginInitialiser))
{
// loader will try to load all providers (MySQL, MSSQL, etc)
// unless it is constrainted to the correct "Provider" entry in the addin.xml
loader.Add(extensionPointPath, new PluginProviderFilter(provider));
loader.Load();
// loader will try to load all providers (MySQL, MSSQL, etc) return loader.Plugins;
// unless it is constrainted to the correct "Provider" entry in the addin.xml }
loader.Add(extensionPointPath, new PluginProviderFilter(provider));
loader.Load();
return loader.Plugins;
} }
/// <summary> /// <summary>

View File

@ -194,10 +194,15 @@ namespace OpenSim.Framework
} }
} }
/// <summary>
/// Unregisters Mono.Addins event handlers, allowing temporary Mono.Addins
/// data to be garbage collected. Since the plugins created by this loader
/// are meant to outlive the loader itself, they must be disposed separately
/// </summary>
public void Dispose() public void Dispose()
{ {
foreach (T plugin in Plugins) AddinManager.AddinLoadError -= on_addinloaderror_;
plugin.Dispose(); AddinManager.AddinLoaded -= on_addinloaded_;
} }
private void initialise_plugin_dir_(string dir) private void initialise_plugin_dir_(string dir)

View File

@ -115,11 +115,11 @@ namespace OpenSim.Grid.GridServer
protected virtual void LoadPlugins() protected virtual void LoadPlugins()
{ {
PluginLoader<IGridPlugin> loader = using (PluginLoader<IGridPlugin> loader = new PluginLoader<IGridPlugin>(new GridPluginInitialiser(this)))
new PluginLoader<IGridPlugin>(new GridPluginInitialiser(this)); {
loader.Load("/OpenSim/GridServer");
loader.Load("/OpenSim/GridServer"); m_plugins = loader.Plugins;
m_plugins = loader.Plugins; }
} }
public override void ShutdownSpecific() public override void ShutdownSpecific()

View File

@ -162,11 +162,11 @@ namespace OpenSim
protected virtual void LoadPlugins() protected virtual void LoadPlugins()
{ {
PluginLoader<IApplicationPlugin> loader = using (PluginLoader<IApplicationPlugin> loader = new PluginLoader<IApplicationPlugin>(new ApplicationPluginInitialiser(this)))
new PluginLoader<IApplicationPlugin>(new ApplicationPluginInitialiser(this)); {
loader.Load("/OpenSim/Startup");
loader.Load("/OpenSim/Startup"); m_plugins = loader.Plugins;
m_plugins = loader.Plugins; }
} }
protected override List<string> GetHelpTopics() protected override List<string> GetHelpTopics()

View File

@ -814,6 +814,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// on to en-US to avoid number parsing issues // on to en-US to avoid number parsing issues
Culture.SetCurrentCulture(); Culture.SetCurrentCulture();
// Typecast the function to an Action<IClientAPI> once here to avoid allocating a new
// Action generic every round
Action<IClientAPI> clientPacketHandler = ClientOutgoingPacketHandler;
while (base.IsRunning) while (base.IsRunning)
{ {
try try
@ -862,7 +866,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Handle outgoing packets, resends, acknowledgements, and pings for each // Handle outgoing packets, resends, acknowledgements, and pings for each
// client. m_packetSent will be set to true if a packet is sent // client. m_packetSent will be set to true if a packet is sent
m_scene.ClientManager.ForEachSync(ClientOutgoingPacketHandler); m_scene.ClientManager.ForEachSync(clientPacketHandler);
// If nothing was sent, sleep for the minimum amount of time before a // If nothing was sent, sleep for the minimum amount of time before a
// token bucket could get more tokens // token bucket could get more tokens

View File

@ -1223,10 +1223,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!m_backingup) if (!m_backingup)
{ {
m_backingup = true; m_backingup = true;
Util.FireAndForget(BackupWaitCallback);
System.ComponentModel.BackgroundWorker backupWorker = new System.ComponentModel.BackgroundWorker();
backupWorker.DoWork += delegate(object sender, System.ComponentModel.DoWorkEventArgs e) { Backup(); };
backupWorker.RunWorkerAsync();
} }
} }
@ -1238,6 +1235,14 @@ namespace OpenSim.Region.Framework.Scenes
m_eventManager.TriggerOnFrame(); m_eventManager.TriggerOnFrame();
} }
/// <summary>
/// Wrapper for Backup() that can be called with Util.FireAndForget()
/// </summary>
private void BackupWaitCallback(object o)
{
Backup();
}
/// <summary> /// <summary>
/// Backup the scene. This acts as the main method of the backup thread. /// Backup the scene. This acts as the main method of the backup thread.
/// </summary> /// </summary>

View File

@ -1396,11 +1396,11 @@
[InterestManagement] [InterestManagement]
; This section controls how state updates are prioritized for each client ; This section controls how state updates are prioritized for each client
; Valid values are Time, Distance, SimpleAngularDistance, and FrontBack ; Valid values are Time, Distance, SimpleAngularDistance, and FrontBack
UpdatePrioritizationScheme = FrontBack; UpdatePrioritizationScheme = FrontBack
ReprioritizationEnabled = true; ReprioritizationEnabled = true
ReprioritizationInterval = 2000.0; ReprioritizationInterval = 2000.0
RootReprioritizationDistance = 10.0; RootReprioritizationDistance = 10.0
ChildReprioritizationDistance = 20.0; ChildReprioritizationDistance = 20.0
;; ;;
;; These are defaults that are overwritten below in [Architecture]. ;; These are defaults that are overwritten below in [Architecture].