direct post listen events on chat, bypassing intermediate storage and timed pooling. ( code still dirty)

This commit is contained in:
UbitUmarov
2022-06-21 02:18:38 +01:00
parent 86dc93ec3b
commit 16d5d7d7fc
6 changed files with 89 additions and 119 deletions

View File

@@ -100,8 +100,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
private const int DEBUG_CHANNEL = 0x7fffffff;
private ListenerManager m_listenerManager;
private ConcurrentQueue<ListenerMessage> m_pending;
private Scene m_scene;
private int m_whisperdistance = 10;
private int m_saydistance = 20;
private int m_shoutdistance = 100;
@@ -146,9 +146,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
public void AddRegion(Scene scene)
{
m_pending = new ConcurrentQueue<ListenerMessage>();
m_scene = scene;
m_listenerManager = new ListenerManager(m_maxlisteners, m_maxhandles, scene, m_pending);
m_listenerManager = new ListenerManager(m_maxlisteners, m_maxhandles, scene);
m_scene.RegisterModuleInterface<IWorldComm>(this);
m_scene.EventManager.OnChatFromClient += DeliverClientMessage;
m_scene.EventManager.OnChatBroadcast += DeliverClientMessage;
@@ -367,7 +366,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
if (channel == 0)
{
// Channel 0 goes to viewer ONLY
m_scene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Direct, 0, pos, name, id, target, false, false);
m_scene.SimChat(msg, ChatTypeEnum.Direct, 0, pos, name, id, target, false, false);
return;
}
@@ -403,25 +402,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
m_listenerManager.TryEnqueueMessage(channel, target, name, id, msg);
}
/// <summary>
/// Are there any listen events ready to be dispatched?
/// </summary>
/// <returns>boolean indication</returns>
public bool HasMessages()
{
return (m_pending.Count > 0);
}
/// <summary>
/// Pop the first availlable listen event from the queue
/// </summary>
/// <returns>ListenerInfo with filter filled in</returns>
public IWorldCommListenerMessage GetNextMessage()
{
m_pending.TryDequeue(out ListenerMessage li);
return li;
}
#endregion
/********************************************************************
@@ -485,7 +465,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
private int m_curlisteners;
private Scene m_scene;
private ConcurrentQueue<ListenerMessage> m_messagesQueue;
/// <summary>
/// Total number of listeners
@@ -504,13 +483,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
}
}
public ListenerManager(int maxlisteners, int maxhandles, Scene scene, ConcurrentQueue<ListenerMessage> messagesQueue)
public ListenerManager(int maxlisteners, int maxhandles, Scene scene)
{
m_maxlisteners = maxlisteners;
m_maxhandles = maxhandles;
m_curlisteners = 0;
m_scene = scene;
m_messagesQueue = messagesQueue;
}
public int AddListener(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg)
@@ -697,6 +675,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
#endregion
public bool HasListeners(int channel)
{
lock (mainLock)
return m_listenersByChannel.TryGetValue(channel, out List<ListenerInfo> listeners) && listeners.Count > 0;
}
/// <summary>
/// Get listeners matching the input parameters.
/// </summary>
@@ -818,14 +802,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
if (maxDistanceSQ > Vector3.DistanceSquared(sPart.AbsolutePosition, position))
{
m_messagesQueue.Enqueue(new ListenerMessage
{
ItemID = li.ItemID,
ID = id,
Channel = channel,
Name = name,
Message = msg
});
m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg);
}
}
}
@@ -876,14 +853,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
continue;
}
}
m_messagesQueue.Enqueue(new ListenerMessage
{
ItemID = li.ItemID,
ID = id,
Channel = channel,
Name = name,
Message = msg
});
m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg);
}
}
}
@@ -936,14 +906,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
continue;
}
}
m_messagesQueue.Enqueue(new ListenerMessage
{
ItemID = li.ItemID,
ID = id,
Channel = channel,
Name = name,
Message = msg
});
m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg);
}
}
}
@@ -996,14 +959,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
continue;
}
}
m_messagesQueue.Enqueue(new ListenerMessage
{
ItemID = li.ItemID,
ID = id,
Channel = channel,
Name = name,
Message = msg
});
m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg);
}
}
}
@@ -1053,14 +1009,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
}
}
}
public class ListenerMessage: IWorldCommListenerMessage
{
public UUID ItemID;
public int Channel;
public UUID ID;
public string Name;
public string Message;
}
public class ListenerInfo : IWorldCommListenerInfo
{

View File

@@ -70,7 +70,6 @@ namespace OpenSim.Region.Framework.Interfaces
/// e.g. for http_request this will be an object array of key request_id, string method, string body
/// </param>
bool PostScriptEvent(UUID itemID, string name, Object[] args);
bool PostObjectEvent(UUID itemID, string name, Object[] args);
/// <summary>

View File

@@ -31,7 +31,6 @@ using OpenSim.Framework;
namespace OpenSim.Region.Framework.Interfaces
{
public interface IWorldCommListenerMessage { }
public interface IWorldCommListenerInfo
{
bool IsActive { get; }
@@ -129,18 +128,6 @@ namespace OpenSim.Region.Framework.Interfaces
/// </param>
void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg);
/// <summary>
/// Are there any listen events ready to be dispatched?
/// </summary>
/// <returns>boolean indication</returns>
bool HasMessages();
/// <summary>
/// Pop the first availlable listen event from the queue
/// </summary>
/// <returns>ListenerInfo with filter filled in</returns>
IWorldCommListenerMessage GetNextMessage();
void ListenControl(UUID itemID, int handle, int active);
void ListenRemove(UUID itemID, int handle);
void DeleteListener(UUID itemID);

View File

@@ -3282,25 +3282,33 @@ namespace OpenSim.Region.Framework.Scenes
OnThrottleUpdate?.Invoke(scenePresence);
}
// public void TriggerGatherUuids(SceneObjectPart sop, IDictionary<UUID, AssetType> assetUuids)
// {
// GatherUuids handler = OnGatherUuids;
//
// if (handler != null)
// {
// foreach (GatherUuids d in handler.GetInvocationList())
// {
// try
// {
// d(sop, assetUuids);
// }
// catch (Exception e)
// {
// m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TriggerUuidGather failed - continuing {0} - {1}",
// e.Message, e.StackTrace);
// }
// }
// }
// }
// public void TriggerGatherUuids(SceneObjectPart sop, IDictionary<UUID, AssetType> assetUuids)
// {
// GatherUuids handler = OnGatherUuids;
//
// if (handler != null)
// {
// foreach (GatherUuids d in handler.GetInvocationList())
// {
// try
// {
// d(sop, assetUuids);
// }
// catch (Exception e)
// {
// m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TriggerUuidGather failed - continuing {0} - {1}",
// e.Message, e.StackTrace);
// }
// }
// }
// }
public delegate void ScriptListen(UUID scriptID, int channel, string name, UUID id, string message);
public event ScriptListen OnScriptListenEvent;
public void TriggerScriptListen(UUID scriptID, int channel, string name, UUID id, string message)
{
OnScriptListenEvent?.Invoke(scriptID, channel, name, id, message);
}
}
}

View File

@@ -71,6 +71,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
myScriptEngine.World.EventManager.OnScriptLandColliderStart += land_collision_start;
myScriptEngine.World.EventManager.OnScriptLandColliding += land_collision;
myScriptEngine.World.EventManager.OnScriptLandColliderEnd += land_collision_end;
myScriptEngine.World.EventManager.OnScriptListenEvent += script_listen;
IMoneyModule money = myScriptEngine.World.RequestModuleInterface<IMoneyModule>();
if (money != null)
{
@@ -236,6 +237,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
}
public void script_listen(UUID scriptID, int channel, string name, UUID id, string message)
{
object[] resobj = new object[]
{
new LSL_Types.LSLInteger(channel),
new LSL_Types.LSLString(name),
new LSL_Types.LSLString(id.ToString()),
new LSL_Types.LSLString(message)
};
myScriptEngine.PostScriptEvent(scriptID, new EventParams("listen", resobj, new DetectParams[0]));
}
// state_entry: not processed here
// state_exit: not processed here

View File

@@ -58,24 +58,27 @@ namespace OpenSim.Region.ScriptEngine.Yengine
private void InitEvents()
{
m_log.Info("[YEngine] Hooking up to server events");
this.World.EventManager.OnAttach += attach;
this.World.EventManager.OnObjectGrab += touch_start;
this.World.EventManager.OnObjectGrabbing += touch;
this.World.EventManager.OnObjectDeGrab += touch_end;
this.World.EventManager.OnScriptChangedEvent += changed;
this.World.EventManager.OnScriptAtTargetEvent += at_target;
this.World.EventManager.OnScriptNotAtTargetEvent += not_at_target;
this.World.EventManager.OnScriptAtRotTargetEvent += at_rot_target;
this.World.EventManager.OnScriptNotAtRotTargetEvent += not_at_rot_target;
this.World.EventManager.OnScriptMovingStartEvent += moving_start;
this.World.EventManager.OnScriptMovingEndEvent += moving_end;
this.World.EventManager.OnScriptControlEvent += control;
this.World.EventManager.OnScriptColliderStart += collision_start;
this.World.EventManager.OnScriptColliding += collision;
this.World.EventManager.OnScriptCollidingEnd += collision_end;
this.World.EventManager.OnScriptLandColliderStart += land_collision_start;
this.World.EventManager.OnScriptLandColliding += land_collision;
this.World.EventManager.OnScriptLandColliderEnd += land_collision_end;
EventManager eManager = this.World.EventManager;
eManager.OnAttach += attach;
eManager.OnObjectGrab += touch_start;
eManager.OnObjectGrabbing += touch;
eManager.OnObjectDeGrab += touch_end;
eManager.OnScriptChangedEvent += changed;
eManager.OnScriptAtTargetEvent += at_target;
eManager.OnScriptNotAtTargetEvent += not_at_target;
eManager.OnScriptAtRotTargetEvent += at_rot_target;
eManager.OnScriptNotAtRotTargetEvent += not_at_rot_target;
eManager.OnScriptMovingStartEvent += moving_start;
eManager.OnScriptMovingEndEvent += moving_end;
eManager.OnScriptControlEvent += control;
eManager.OnScriptColliderStart += collision_start;
eManager.OnScriptColliding += collision;
eManager.OnScriptCollidingEnd += collision_end;
eManager.OnScriptLandColliderStart += land_collision_start;
eManager.OnScriptLandColliding += land_collision;
eManager.OnScriptLandColliderEnd += land_collision_end;
eManager.OnScriptListenEvent += script_listen;
IMoneyModule money = this.World.RequestModuleInterface<IMoneyModule>();
if(money != null)
{
@@ -209,12 +212,24 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
}
public void script_listen(UUID scriptID, int channel, string name, UUID id, string message)
{
object[] resobj = new object[]
{
new LSL_Types.LSLInteger(channel),
new LSL_Types.LSLString(name),
new LSL_Types.LSLString(id.ToString()),
new LSL_Types.LSLString(message)
};
PostScriptEvent(scriptID, new EventParams("listen", resobj, new DetectParams[0]));
}
// state_entry: not processed here
// state_exit: not processed here
public void money(uint localID, UUID agentID, int amount, DetectParams[] det)
{
this.PostObjectEvent(localID, new EventParams(
PostObjectEvent(localID, new EventParams(
"money", new object[] {
agentID.ToString(),
amount },