aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tools
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-08-13 22:38:27 +0100
committerJustin Clark-Casey (justincc)2014-08-13 22:38:27 +0100
commit21176a3a901dd2190a1847acf576b938c0885e23 (patch)
treede76b08895632480f439bc026127126523c8ca93 /OpenSim/Tools
parentAdd 'server' stats information to pCampbot, as used elsewhere in OpenSimulator (diff)
downloadopensim-SC_OLD-21176a3a901dd2190a1847acf576b938c0885e23.zip
opensim-SC_OLD-21176a3a901dd2190a1847acf576b938c0885e23.tar.gz
opensim-SC_OLD-21176a3a901dd2190a1847acf576b938c0885e23.tar.bz2
opensim-SC_OLD-21176a3a901dd2190a1847acf576b938c0885e23.tar.xz
Terminate 'nothing' behaviour (and potentially others) by signalling using an event rather than polling connection state every 100ms
This kind of polling is very expensive with many bots/polling threads and appears to be the primary cause of bot falloff from the client end at higher loads. Where inbound packet threads can't run in time due to contention and simulator disconnect timeout occurs.
Diffstat (limited to 'OpenSim/Tools')
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs14
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs10
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs2
-rw-r--r--OpenSim/Tools/pCampBot/Bot.cs58
-rw-r--r--OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs8
5 files changed, 56 insertions, 36 deletions
diff --git a/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs
index 9bc8512..c1ba36b 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs
@@ -29,11 +29,12 @@ using OpenMetaverse;
29using System; 29using System;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Linq; 31using System.Linq;
32using System.Threading;
32using pCampBot.Interfaces; 33using pCampBot.Interfaces;
33 34
34namespace pCampBot 35namespace pCampBot
35{ 36{
36 public class AbstractBehaviour : IBehaviour 37 public abstract class AbstractBehaviour : IBehaviour
37 { 38 {
38 /// <summary> 39 /// <summary>
39 /// Abbreviated name of this behaviour. 40 /// Abbreviated name of this behaviour.
@@ -44,13 +45,20 @@ namespace pCampBot
44 45
45 public Bot Bot { get; protected set; } 46 public Bot Bot { get; protected set; }
46 47
47 public virtual void Action() {} 48 public abstract void Action();
49
50 public virtual void Interrupt() {}
51
52 protected AutoResetEvent m_interruptEvent = new AutoResetEvent(false);
48 53
49 public virtual void Initialize(Bot bot) 54 public virtual void Initialize(Bot bot)
50 { 55 {
51 Bot = bot; 56 Bot = bot;
52 } 57 }
53 58
54 public virtual void Close() {} 59 public virtual void Close()
60 {
61 Interrupt();
62 }
55 } 63 }
56} 64}
diff --git a/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs
index 9a3075c..4a7237c 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs
@@ -43,5 +43,15 @@ namespace pCampBot
43 AbbreviatedName = "n"; 43 AbbreviatedName = "n";
44 Name = "None"; 44 Name = "None";
45 } 45 }
46
47 public override void Action()
48 {
49 m_interruptEvent.WaitOne();
50 }
51
52 public override void Interrupt()
53 {
54 m_interruptEvent.Set();
55 }
46 } 56 }
47} \ No newline at end of file 57} \ No newline at end of file
diff --git a/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs
index 6fd2b7c..98ab931 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs
@@ -82,6 +82,8 @@ namespace pCampBot
82 { 82 {
83 if (Bot.ConnectionState == ConnectionState.Connected) 83 if (Bot.ConnectionState == ConnectionState.Connected)
84 Bot.Client.Self.Jump(false); 84 Bot.Client.Self.Jump(false);
85
86 base.Close();
85 } 87 }
86 88
87 private string[] readexcuses() 89 private string[] readexcuses()
diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs
index bd5eb81..fd9ae3f 100644
--- a/OpenSim/Tools/pCampBot/Bot.cs
+++ b/OpenSim/Tools/pCampBot/Bot.cs
@@ -192,15 +192,15 @@ namespace pCampBot
192 192
193 public bool AddBehaviour(IBehaviour behaviour) 193 public bool AddBehaviour(IBehaviour behaviour)
194 { 194 {
195 lock (Behaviours) 195 Dictionary<string, IBehaviour> updatedBehaviours = new Dictionary<string, IBehaviour>(Behaviours);
196 {
197 if (!Behaviours.ContainsKey(behaviour.AbbreviatedName))
198 {
199 behaviour.Initialize(this);
200 Behaviours.Add(behaviour.AbbreviatedName, behaviour);
201 196
202 return true; 197 if (!updatedBehaviours.ContainsKey(behaviour.AbbreviatedName))
203 } 198 {
199 behaviour.Initialize(this);
200 updatedBehaviours.Add(behaviour.AbbreviatedName, behaviour);
201 Behaviours = updatedBehaviours;
202
203 return true;
204 } 204 }
205 205
206 return false; 206 return false;
@@ -208,18 +208,17 @@ namespace pCampBot
208 208
209 public bool RemoveBehaviour(string abbreviatedName) 209 public bool RemoveBehaviour(string abbreviatedName)
210 { 210 {
211 lock (Behaviours) 211 Dictionary<string, IBehaviour> updatedBehaviours = new Dictionary<string, IBehaviour>(Behaviours);
212 { 212 IBehaviour behaviour;
213 IBehaviour behaviour;
214 213
215 if (!Behaviours.TryGetValue(abbreviatedName, out behaviour)) 214 if (!updatedBehaviours.TryGetValue(abbreviatedName, out behaviour))
216 return false; 215 return false;
217 216
218 behaviour.Close(); 217 behaviour.Close();
219 Behaviours.Remove(abbreviatedName); 218 updatedBehaviours.Remove(abbreviatedName);
219 Behaviours = updatedBehaviours;
220 220
221 return true; 221 return true;
222 }
223 } 222 }
224 223
225 private void CreateLibOmvClient() 224 private void CreateLibOmvClient()
@@ -279,24 +278,17 @@ namespace pCampBot
279 { 278 {
280 while (ConnectionState == ConnectionState.Connected) 279 while (ConnectionState == ConnectionState.Connected)
281 { 280 {
282 lock (Behaviours) 281 foreach (IBehaviour behaviour in Behaviours.Values)
283 { 282 {
284 foreach (IBehaviour behaviour in Behaviours.Values)
285 {
286// Thread.Sleep(Random.Next(3000, 10000)); 283// Thread.Sleep(Random.Next(3000, 10000));
287 284
288 // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); 285 // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType());
289 behaviour.Action(); 286 behaviour.Action();
290 }
291 } 287 }
292
293 // XXX: This is a really shitty way of yielding so that behaviours can be added/removed
294 Thread.Sleep(100);
295 } 288 }
296 289
297 lock (Behaviours) 290 foreach (IBehaviour b in Behaviours.Values)
298 foreach (IBehaviour b in Behaviours.Values) 291 b.Close();
299 b.Close();
300 } 292 }
301 293
302 /// <summary> 294 /// <summary>
@@ -305,9 +297,9 @@ namespace pCampBot
305 public void Disconnect() 297 public void Disconnect()
306 { 298 {
307 ConnectionState = ConnectionState.Disconnecting; 299 ConnectionState = ConnectionState.Disconnecting;
308 300
309// if (m_actionThread != null) 301 foreach (IBehaviour behaviour in Behaviours.Values)
310// m_actionThread.Abort(); 302 behaviour.Interrupt();
311 303
312 Client.Network.Logout(); 304 Client.Network.Logout();
313 } 305 }
diff --git a/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs b/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs
index 0ed4825..660c630 100644
--- a/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs
@@ -51,6 +51,14 @@ namespace pCampBot.Interfaces
51 void Initialize(Bot bot); 51 void Initialize(Bot bot);
52 52
53 /// <summary> 53 /// <summary>
54 /// Interrupt the behaviour.
55 /// </summary>
56 /// <remarks>
57 /// This should cause the current Action call() to terminate if this is active.
58 /// </remarks>
59 void Interrupt();
60
61 /// <summary>
54 /// Close down this behaviour. 62 /// Close down this behaviour.
55 /// </summary> 63 /// </summary>
56 /// <remarks> 64 /// <remarks>