diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 391326f..468dccf 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | |||
@@ -28,10 +28,12 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Threading; | ||
31 | using Nini.Config; | 32 | using Nini.Config; |
32 | using log4net; | 33 | using log4net; |
33 | using OpenMetaverse; | 34 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Framework.Monitoring; | ||
35 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
36 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
37 | 39 | ||
@@ -45,9 +47,14 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
45 | private Scene m_scene; | 47 | private Scene m_scene; |
46 | private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>(); | 48 | private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>(); |
47 | private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); | 49 | private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); |
48 | private double lastFilesExpire = 0; | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
50 | 51 | ||
52 | |||
53 | private object timeTickLock = new object(); | ||
54 | private double lastTimeTick = 0.0; | ||
55 | private bool inTimeTick = false; | ||
56 | private double lastFilesExpire = 0.0; | ||
57 | |||
51 | public struct XferRequest | 58 | public struct XferRequest |
52 | { | 59 | { |
53 | public IClientAPI remoteClient; | 60 | public IClientAPI remoteClient; |
@@ -67,20 +74,22 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
67 | 74 | ||
68 | public void Initialise(IConfigSource config) | 75 | public void Initialise(IConfigSource config) |
69 | { | 76 | { |
70 | lastFilesExpire = Util.GetTimeStampMS() + 300000.0; | 77 | lastTimeTick = Util.GetTimeStampMS() + 30000.0; |
78 | lastFilesExpire = lastTimeTick + 180000.0; | ||
71 | } | 79 | } |
72 | 80 | ||
73 | public void AddRegion(Scene scene) | 81 | public void AddRegion(Scene scene) |
74 | { | 82 | { |
75 | m_scene = scene; | 83 | m_scene = scene; |
76 | m_scene.EventManager.OnNewClient += NewClient; | 84 | m_scene.EventManager.OnNewClient += NewClient; |
77 | 85 | m_scene.EventManager.OnRegionHeartbeatEnd += OnTimeTick; | |
78 | m_scene.RegisterModuleInterface<IXfer>(this); | 86 | m_scene.RegisterModuleInterface<IXfer>(this); |
79 | } | 87 | } |
80 | 88 | ||
81 | public void RemoveRegion(Scene scene) | 89 | public void RemoveRegion(Scene scene) |
82 | { | 90 | { |
83 | m_scene.EventManager.OnNewClient -= NewClient; | 91 | m_scene.EventManager.OnNewClient -= NewClient; |
92 | m_scene.EventManager.OnRegionHeartbeatEnd -= OnTimeTick; | ||
84 | 93 | ||
85 | m_scene.UnregisterModuleInterface<IXfer>(this); | 94 | m_scene.UnregisterModuleInterface<IXfer>(this); |
86 | m_scene = null; | 95 | m_scene = null; |
@@ -106,6 +115,35 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
106 | 115 | ||
107 | #endregion | 116 | #endregion |
108 | 117 | ||
118 | public void OnTimeTick(Scene scene) | ||
119 | { | ||
120 | // we are on a heartbeat thread we there can be several | ||
121 | if(Monitor.TryEnter(timeTickLock)) | ||
122 | { | ||
123 | if(!inTimeTick) | ||
124 | { | ||
125 | double now = Util.GetTimeStampMS(); | ||
126 | if(now - lastTimeTick > 1500.0) // 1.5 second | ||
127 | { | ||
128 | inTimeTick = true; | ||
129 | |||
130 | //don't overload busy heartbeat | ||
131 | WorkManager.RunInThread( | ||
132 | delegate | ||
133 | { | ||
134 | transfersTimeTick(now); | ||
135 | expireFiles(now); | ||
136 | |||
137 | lastTimeTick = now; | ||
138 | inTimeTick = false; | ||
139 | }, | ||
140 | null, | ||
141 | "XferTimeTick"); | ||
142 | } | ||
143 | } | ||
144 | Monitor.Exit(timeTickLock); | ||
145 | } | ||
146 | } | ||
109 | #region IXfer Members | 147 | #region IXfer Members |
110 | 148 | ||
111 | /// <summary> | 149 | /// <summary> |
@@ -135,26 +173,31 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
135 | fd.timeStampMS = now; | 173 | fd.timeStampMS = now; |
136 | NewFiles.Add(fileName, fd); | 174 | NewFiles.Add(fileName, fd); |
137 | } | 175 | } |
176 | } | ||
177 | return true; | ||
178 | } | ||
138 | 179 | ||
139 | // lazy expires hopefully we will not have many files so nasty code will do it | 180 | #endregion |
140 | if(now - lastFilesExpire > 180000.0) | 181 | public void expireFiles(double now) |
182 | { | ||
183 | lock (NewFiles) | ||
184 | { | ||
185 | // hopefully we will not have many files so nasty code will do it | ||
186 | if(now - lastFilesExpire > 120000.0) | ||
141 | { | 187 | { |
142 | lastFilesExpire = now; | 188 | lastFilesExpire = now; |
143 | List<string> expires = new List<string>(); | 189 | List<string> expires = new List<string>(); |
144 | foreach(string fname in NewFiles.Keys) | 190 | foreach(string fname in NewFiles.Keys) |
145 | { | 191 | { |
146 | if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 180000.0) | 192 | if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 120000.0) |
147 | expires.Add(fname); | 193 | expires.Add(fname); |
148 | } | 194 | } |
149 | foreach(string fname in expires) | 195 | foreach(string fname in expires) |
150 | NewFiles.Remove(fname); | 196 | NewFiles.Remove(fname); |
151 | } | 197 | } |
152 | } | 198 | } |
153 | return true; | ||
154 | } | 199 | } |
155 | 200 | ||
156 | #endregion | ||
157 | |||
158 | public void NewClient(IClientAPI client) | 201 | public void NewClient(IClientAPI client) |
159 | { | 202 | { |
160 | client.OnRequestXfer += RequestXfer; | 203 | client.OnRequestXfer += RequestXfer; |
@@ -162,6 +205,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
162 | client.OnAbortXfer += AbortXfer; | 205 | client.OnAbortXfer += AbortXfer; |
163 | } | 206 | } |
164 | 207 | ||
208 | public void transfersTimeTick(double now) | ||
209 | { | ||
210 | |||
211 | } | ||
212 | |||
165 | /// <summary> | 213 | /// <summary> |
166 | /// | 214 | /// |
167 | /// </summary> | 215 | /// </summary> |