aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/Util.cs7
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs81
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs45
3 files changed, 49 insertions, 84 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index a855767..af14939 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -2967,9 +2967,9 @@ namespace OpenSim.Framework
2967 /// <returns></returns> 2967 /// <returns></returns>
2968 public static Int32 EnvironmentTickCount() 2968 public static Int32 EnvironmentTickCount()
2969 { 2969 {
2970 double now = GetTimeStampMS(); 2970 return Environment.TickCount & EnvironmentTickCountMask;
2971 return (int)now;
2972 } 2971 }
2972
2973 const Int32 EnvironmentTickCountMask = 0x3fffffff; 2973 const Int32 EnvironmentTickCountMask = 0x3fffffff;
2974 2974
2975 /// <summary> 2975 /// <summary>
@@ -2994,8 +2994,7 @@ namespace OpenSim.Framework
2994 /// <returns>subtraction of passed prevValue from current Environment.TickCount</returns> 2994 /// <returns>subtraction of passed prevValue from current Environment.TickCount</returns>
2995 public static Int32 EnvironmentTickCountSubtract(Int32 prevValue) 2995 public static Int32 EnvironmentTickCountSubtract(Int32 prevValue)
2996 { 2996 {
2997 double now = GetTimeStampMS(); 2997 return EnvironmentTickCountSubtract(EnvironmentTickCount(), prevValue);
2998 return EnvironmentTickCountSubtract((int)now, prevValue);
2999 } 2998 }
3000 2999
3001 // Returns value of Tick Count A - TickCount B accounting for wrapping of TickCount 3000 // Returns value of Tick Count A - TickCount B accounting for wrapping of TickCount
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
index a721454..ba917e39 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
@@ -221,7 +221,7 @@ namespace OpenSim.Region.ClientStack.Linden
221 PollServiceMeshEventArgs args; 221 PollServiceMeshEventArgs args;
222 if (m_pollservices.TryGetValue(user, out args)) 222 if (m_pollservices.TryGetValue(user, out args))
223 { 223 {
224 args.UpdateThrottle(imagethrottle, p); 224 args.UpdateThrottle(imagethrottle);
225 } 225 }
226 } 226 }
227 227
@@ -238,14 +238,13 @@ namespace OpenSim.Region.ClientStack.Linden
238 base(null, uri, null, null, null, pId, int.MaxValue) 238 base(null, uri, null, null, null, pId, int.MaxValue)
239 { 239 {
240 m_scene = scene; 240 m_scene = scene;
241 m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene, pId); 241 m_throttler = new MeshCapsDataThrottler(100000);
242 // x is request id, y is userid 242 // x is request id, y is userid
243 HasEvents = (x, y) => 243 HasEvents = (x, y) =>
244 { 244 {
245 lock (responses) 245 lock (responses)
246 { 246 {
247 bool ret = m_throttler.hasEvents(x, responses); 247 bool ret = m_throttler.hasEvents(x, responses);
248 m_throttler.ProcessTime();
249 return ret; 248 return ret;
250 249
251 } 250 }
@@ -260,8 +259,8 @@ namespace OpenSim.Region.ClientStack.Linden
260 } 259 }
261 finally 260 finally
262 { 261 {
263 m_throttler.ProcessTime();
264 responses.Remove(x); 262 responses.Remove(x);
263 m_throttler.PassTime();
265 } 264 }
266 } 265 }
267 }; 266 };
@@ -274,6 +273,7 @@ namespace OpenSim.Region.ClientStack.Linden
274 reqinfo.request = y; 273 reqinfo.request = y;
275 274
276 m_queue.Enqueue(reqinfo); 275 m_queue.Enqueue(reqinfo);
276 m_throttler.PassTime();
277 }; 277 };
278 278
279 // this should never happen except possible on shutdown 279 // this should never happen except possible on shutdown
@@ -335,12 +335,15 @@ namespace OpenSim.Region.ClientStack.Linden
335 }; 335 };
336 336
337 } 337 }
338 m_throttler.ProcessTime(); 338 m_throttler.PassTime();
339 } 339 }
340 340
341 internal void UpdateThrottle(int pimagethrottle, ScenePresence p) 341 internal void UpdateThrottle(int pthrottle)
342 { 342 {
343 m_throttler.UpdateThrottle(pimagethrottle, p); 343 int tmp = 2 * pthrottle;
344 if(tmp < 10000)
345 tmp = 10000;
346 m_throttler.ThrottleBytes = tmp;
344 } 347 }
345 } 348 }
346 349
@@ -394,25 +397,15 @@ namespace OpenSim.Region.ClientStack.Linden
394 397
395 internal sealed class MeshCapsDataThrottler 398 internal sealed class MeshCapsDataThrottler
396 { 399 {
400 private double lastTimeElapsed = 0;
401 private double BytesSent = 0;
397 402
398 private volatile int currenttime = 0; 403 public MeshCapsDataThrottler(int pBytes)
399 private volatile int lastTimeElapsed = 0;
400 private volatile int BytesSent = 0;
401 private int CapSetThrottle = 0;
402 private float CapThrottleDistributon = 0.30f;
403 private readonly Scene m_scene;
404 private ThrottleOutPacketType Throttle;
405 private readonly UUID User;
406
407 public MeshCapsDataThrottler(int pBytes, int max, int min, Scene pScene, UUID puser)
408 { 404 {
405 if(pBytes < 10000)
406 pBytes = 10000;
409 ThrottleBytes = pBytes; 407 ThrottleBytes = pBytes;
410 if(ThrottleBytes < 10000) 408 lastTimeElapsed = Util.GetTimeStampMS();
411 ThrottleBytes = 10000;
412 lastTimeElapsed = Util.EnvironmentTickCount();
413 Throttle = ThrottleOutPacketType.Asset;
414 m_scene = pScene;
415 User = puser;
416 } 409 }
417 410
418 public bool hasEvents(UUID key, Dictionary<UUID, aPollResponse> responses) 411 public bool hasEvents(UUID key, Dictionary<UUID, aPollResponse> responses)
@@ -442,46 +435,22 @@ namespace OpenSim.Region.ClientStack.Linden
442 return haskey; 435 return haskey;
443 } 436 }
444 437
445 public void ProcessTime() 438 public void PassTime()
446 {
447 PassTime();
448 }
449
450 private void PassTime()
451 { 439 {
452 currenttime = Util.EnvironmentTickCount(); 440 double currenttime = Util.GetTimeStampMS();
453 int timeElapsed = Util.EnvironmentTickCountSubtract(currenttime, lastTimeElapsed); 441 double timeElapsed = currenttime - lastTimeElapsed;
454 if (timeElapsed >= 100) 442 if(timeElapsed < 50.0)
443 return;
444 int add = (int)(ThrottleBytes * timeElapsed * 0.001);
445 if (add >= 1000)
455 { 446 {
456 lastTimeElapsed = currenttime; 447 lastTimeElapsed = currenttime;
457 BytesSent -= (ThrottleBytes * timeElapsed / 1000); 448 BytesSent -= add;
458 if (BytesSent < 0) BytesSent = 0; 449 if (BytesSent < 0) BytesSent = 0;
459 } 450 }
460 } 451 }
461 452
462 private void AlterThrottle(int setting, ScenePresence p) 453 public int ThrottleBytes;
463 {
464 p.ControllingClient.SetAgentThrottleSilent((int)Throttle,setting);
465 }
466
467 public int ThrottleBytes
468 {
469 get { return CapSetThrottle; }
470 set
471 {
472 if (value > 10000)
473 CapSetThrottle = value;
474 else
475 CapSetThrottle = 10000;
476 }
477 }
478
479 internal void UpdateThrottle(int pimagethrottle, ScenePresence p)
480 {
481 // Client set throttle !
482 CapSetThrottle = 2 * pimagethrottle;
483 ProcessTime();
484 }
485 } 454 }
486 } 455 }
487} 456}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
index ce9798b..b01c7dc 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
@@ -220,7 +220,7 @@ namespace OpenSim.Region.ClientStack.Linden
220 new Dictionary<UUID, aPollResponse>(); 220 new Dictionary<UUID, aPollResponse>();
221 221
222 private Scene m_scene; 222 private Scene m_scene;
223 private CapsDataThrottler m_throttler = new CapsDataThrottler(100000, 1400000,10000); 223 private CapsDataThrottler m_throttler = new CapsDataThrottler(100000);
224 public PollServiceTextureEventArgs(UUID pId, Scene scene) : 224 public PollServiceTextureEventArgs(UUID pId, Scene scene) :
225 base(null, "", null, null, null, pId, int.MaxValue) 225 base(null, "", null, null, null, pId, int.MaxValue)
226 { 226 {
@@ -231,7 +231,6 @@ namespace OpenSim.Region.ClientStack.Linden
231 lock (responses) 231 lock (responses)
232 { 232 {
233 bool ret = m_throttler.hasEvents(x, responses); 233 bool ret = m_throttler.hasEvents(x, responses);
234 m_throttler.ProcessTime();
235 return ret; 234 return ret;
236 235
237 } 236 }
@@ -247,6 +246,7 @@ namespace OpenSim.Region.ClientStack.Linden
247 finally 246 finally
248 { 247 {
249 responses.Remove(x); 248 responses.Remove(x);
249 m_throttler.PassTime();
250 } 250 }
251 } 251 }
252 }; 252 };
@@ -271,6 +271,7 @@ namespace OpenSim.Region.ClientStack.Linden
271 } 271 }
272 } 272 }
273 m_queue.Enqueue(reqinfo); 273 m_queue.Enqueue(reqinfo);
274 m_throttler.PassTime();
274 }; 275 };
275 276
276 // this should never happen except possible on shutdown 277 // this should never happen except possible on shutdown
@@ -351,14 +352,15 @@ namespace OpenSim.Region.ClientStack.Linden
351 }; 352 };
352 353
353 } 354 }
354 m_throttler.ProcessTime(); 355 m_throttler.PassTime();
355 } 356 }
356 357
357 internal void UpdateThrottle(int pimagethrottle) 358 internal void UpdateThrottle(int pimagethrottle)
358 { 359 {
359 m_throttler.ThrottleBytes = 2 * pimagethrottle; 360 int tmp = 2 * pimagethrottle;
360 if(m_throttler.ThrottleBytes < 10000) 361 if(tmp < 10000)
361 m_throttler.ThrottleBytes = 10000; 362 tmp = 10000;
363 m_throttler.ThrottleBytes = tmp;
362 } 364 }
363 } 365 }
364 366
@@ -426,16 +428,14 @@ namespace OpenSim.Region.ClientStack.Linden
426 428
427 internal sealed class CapsDataThrottler 429 internal sealed class CapsDataThrottler
428 { 430 {
429 431 private double lastTimeElapsed = 0;
430 private volatile int currenttime = 0;
431 private volatile int lastTimeElapsed = 0;
432 private volatile int BytesSent = 0; 432 private volatile int BytesSent = 0;
433 public CapsDataThrottler(int pBytes, int max, int min) 433 public CapsDataThrottler(int pBytes)
434 { 434 {
435 if(pBytes < 10000)
436 pBytes = 10000;
435 ThrottleBytes = pBytes; 437 ThrottleBytes = pBytes;
436 if(ThrottleBytes < 10000) 438 lastTimeElapsed = Util.GetTimeStampMS();
437 ThrottleBytes = 10000;
438 lastTimeElapsed = Util.EnvironmentTickCount();
439 } 439 }
440 public bool hasEvents(UUID key, Dictionary<UUID, GetTextureModule.aPollResponse> responses) 440 public bool hasEvents(UUID key, Dictionary<UUID, GetTextureModule.aPollResponse> responses)
441 { 441 {
@@ -468,20 +468,17 @@ namespace OpenSim.Region.ClientStack.Linden
468 return haskey; 468 return haskey;
469 } 469 }
470 470
471 public void ProcessTime() 471 public void PassTime()
472 {
473 PassTime();
474 }
475
476 private void PassTime()
477 { 472 {
478 currenttime = Util.EnvironmentTickCount(); 473 double currenttime = Util.GetTimeStampMS();
479 int timeElapsed = Util.EnvironmentTickCountSubtract(currenttime, lastTimeElapsed); 474 double timeElapsed = currenttime - lastTimeElapsed;
480 //processTimeBasedActions(responses); 475 if(timeElapsed < 50.0)
481 if (timeElapsed >= 100) 476 return;
477 int add = (int)(ThrottleBytes * timeElapsed * 0.001);
478 if (add >= 1000)
482 { 479 {
483 lastTimeElapsed = currenttime; 480 lastTimeElapsed = currenttime;
484 BytesSent -= (ThrottleBytes * timeElapsed / 1000); 481 BytesSent -= add;
485 if (BytesSent < 0) BytesSent = 0; 482 if (BytesSent < 0) BytesSent = 0;
486 } 483 }
487 } 484 }