LIBOMV-636: Dereference timers so GC can collect GridClient and managers

git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2998 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
Latif Khalifa
2009-07-17 16:54:45 +00:00
parent 13f10b25bf
commit de0e00a1f0
4 changed files with 66 additions and 20 deletions

View File

@@ -397,12 +397,18 @@ namespace OpenMetaverse
{
if (value > 0)
{
updateTimer.Change(value, value);
if (updateTimer != null)
{
updateTimer.Change(value, value);
}
updateInterval = value;
}
else
{
updateTimer.Change(Timeout.Infinite, Timeout.Infinite);
if (updateTimer != null)
{
updateTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
updateInterval = 0;
}
}
@@ -467,10 +473,29 @@ namespace OpenMetaverse
{
Client = client;
Camera = new AgentCamera();
client.Network.OnConnected += new NetworkManager.ConnectedCallback(Network_OnConnected);
client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(Network_OnDisconnected);
updateInterval = Settings.DEFAULT_AGENT_UPDATE_INTERVAL;
updateTimer = new Timer(new TimerCallback(UpdateTimer_Elapsed), null, Settings.DEFAULT_AGENT_UPDATE_INTERVAL,
Settings.DEFAULT_AGENT_UPDATE_INTERVAL);
}
private void CleanupTimer()
{
if (updateTimer != null)
{
updateTimer.Dispose();
updateTimer = null;
}
}
private void Network_OnDisconnected(NetworkManager.DisconnectType reason, string message)
{
CleanupTimer();
}
private void Network_OnConnected(object sender)
{
CleanupTimer();
updateTimer = new Timer(new TimerCallback(UpdateTimer_Elapsed), null, updateInterval, updateInterval);
}
/// <summary>

View File

@@ -389,6 +389,8 @@ namespace OpenMetaverse
protected ObjectManager(GridClient client, bool registerCallbacks)
{
Client = client;
Client.Network.OnConnected += new NetworkManager.ConnectedCallback(Network_OnConnected);
Client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(Network_OnDisconnected);
if (registerCallbacks)
{
@@ -396,6 +398,23 @@ namespace OpenMetaverse
}
}
void Network_OnDisconnected(NetworkManager.DisconnectType reason, string message)
{
if (InterpolationTimer != null)
{
InterpolationTimer.Dispose();
InterpolationTimer = null;
}
}
void Network_OnConnected(object sender)
{
if (Settings.USE_INTERPOLATION_TIMER)
{
InterpolationTimer = new Timer(InterpolationTimer_Elapsed, null, Settings.INTERPOLATION_INTERVAL, Timeout.Infinite);
}
}
protected void RegisterCallbacks()
{
Client.Network.RegisterCallback(PacketType.ObjectUpdate, UpdateHandler);
@@ -406,14 +425,6 @@ namespace OpenMetaverse
Client.Network.RegisterCallback(PacketType.ObjectPropertiesFamily, ObjectPropertiesFamilyHandler);
Client.Network.RegisterCallback(PacketType.ObjectProperties, ObjectPropertiesHandler);
Client.Network.RegisterCallback(PacketType.PayPriceReply, PayPriceReplyHandler);
// If the callbacks aren't registered there's not point in doing client-side path prediction,
// so we set it up here
if (Settings.USE_INTERPOLATION_TIMER)
{
InterpolationTimer = new Timer(InterpolationTimer_Elapsed, null, Settings.INTERPOLATION_INTERVAL,
Timeout.Infinite);
}
}
#region Action Methods
@@ -2952,7 +2963,10 @@ namespace OpenMetaverse
// Start the timer again. Use a minimum of a 50ms pause in between calculations
int delay = Math.Max(50, Settings.INTERPOLATION_INTERVAL - elapsed);
InterpolationTimer.Change(delay, Timeout.Infinite);
if (InterpolationTimer != null)
{
InterpolationTimer.Change(delay, Timeout.Infinite);
}
}
}
}

View File

@@ -581,6 +581,10 @@ namespace OpenMetaverse
if (StatsTimer != null) StatsTimer.Dispose();
if (PingTimer != null) PingTimer.Dispose();
AckTimer = null;
StatsTimer = null;
PingTimer = null;
// Kill the current CAPS system
if (Caps != null)
{

View File

@@ -136,8 +136,7 @@ namespace OpenMetaverse
/// <summary>A synchronization object used by the primary thread</summary>
private object lockerObject = new object();
/// <summary>A refresh timer used to increase the priority of stalled requests</summary>
private readonly System.Timers.Timer RefreshDownloadsTimer =
new System.Timers.Timer(Settings.PIPELINE_REFRESH_INTERVAL);
private System.Timers.Timer RefreshDownloadsTimer;
/// <summary>Current number of pending and in-process transfers</summary>
public int TransferCount { get { return _Transfers.Count; } }
@@ -172,8 +171,6 @@ namespace OpenMetaverse
downloadMaster = new Thread(DownloadThread);
downloadMaster.Name = "TexturePipeline";
downloadMaster.IsBackground = true;
RefreshDownloadsTimer.Elapsed += RefreshDownloadsTimer_Elapsed;
}
/// <summary>
@@ -190,7 +187,12 @@ namespace OpenMetaverse
_Client.Network.RegisterCallback(PacketType.ImagePacket, ImagePacketHandler);
_Client.Network.RegisterCallback(PacketType.ImageNotInDatabase, ImageNotInDatabaseHandler);
downloadMaster.Start();
RefreshDownloadsTimer.Start();
if (RefreshDownloadsTimer == null)
{
RefreshDownloadsTimer = new System.Timers.Timer(Settings.PIPELINE_REFRESH_INTERVAL);
RefreshDownloadsTimer.Elapsed += RefreshDownloadsTimer_Elapsed;
RefreshDownloadsTimer.Start();
}
}
/// <summary>
@@ -204,7 +206,8 @@ namespace OpenMetaverse
Logger.Log(String.Format("Combined Execution Time: {0}, Network Execution Time {1}, Network {2}K/sec, Image Size {3}",
TotalTime, NetworkTime, Math.Round(TotalBytes / NetworkTime.TotalSeconds / 60, 2), TotalBytes), Helpers.LogLevel.Debug);
#endif
RefreshDownloadsTimer.Stop();
RefreshDownloadsTimer.Dispose();
RefreshDownloadsTimer = null;
_Client.Network.UnregisterCallback(PacketType.ImageNotInDatabase, ImageNotInDatabaseHandler);
_Client.Network.UnregisterCallback(PacketType.ImageData, ImageDataHandler);