llClientView: try to have only one thread per client processing
RegionHandleRequests. (code assumes packet handle is called async as it is not)avinationmerge
parent
71d2d327d0
commit
a91ca984d5
|
@ -8751,16 +8751,61 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
#region Parcel related packets
|
#region Parcel related packets
|
||||||
|
|
||||||
|
// acumulate several HandleRegionHandleRequest consecutive overlaping requests
|
||||||
|
// to be done with minimal resources as possible
|
||||||
|
// variables temporary here while in test
|
||||||
|
|
||||||
|
Queue<UUID> RegionHandleRequests = new Queue<UUID>();
|
||||||
|
bool RegionHandleRequestsInService = false;
|
||||||
|
|
||||||
private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
|
private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
|
UUID currentUUID;
|
||||||
|
|
||||||
RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
|
RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
|
||||||
if (handlerRegionHandleRequest != null)
|
|
||||||
{
|
if (handlerRegionHandleRequest == null)
|
||||||
handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
|
||||||
|
|
||||||
|
lock (RegionHandleRequests)
|
||||||
|
{
|
||||||
|
if (RegionHandleRequestsInService)
|
||||||
|
{
|
||||||
|
// we are already busy doing a previus request
|
||||||
|
// so enqueue it
|
||||||
|
RegionHandleRequests.Enqueue(rhrPack.RequestBlock.RegionID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// else do it
|
||||||
|
currentUUID = rhrPack.RequestBlock.RegionID;
|
||||||
|
RegionHandleRequestsInService = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
handlerRegionHandleRequest(this, currentUUID);
|
||||||
|
|
||||||
|
lock (RegionHandleRequests)
|
||||||
|
{
|
||||||
|
// exit condition, nothing to do or closed
|
||||||
|
// current code seems to assume we may loose the handler at anytime,
|
||||||
|
// so keep checking it
|
||||||
|
handlerRegionHandleRequest = OnRegionHandleRequest;
|
||||||
|
|
||||||
|
if (RegionHandleRequests.Count == 0 || !IsActive || handlerRegionHandleRequest == null)
|
||||||
|
{
|
||||||
|
RegionHandleRequests.Clear();
|
||||||
|
RegionHandleRequestsInService = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
currentUUID = RegionHandleRequests.Dequeue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true; // actually unreached
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
|
private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
|
||||||
|
|
Loading…
Reference in New Issue