Provide names and pools when creating MiniYaml.
- Rename the filename parameter to name and make it mandatory. Review all callers and ensure a useful string is provided as input, to ensure sufficient context is included for logging and debugging. This can be a filename, url, or any arbitrary text so include whatever context seems reasonable. - When several MiniYamls are created that have similar content, provide a shared string pool. This allows strings that are common between all the yaml to be shared, reducing long term memory usage. We also change the pool from a dictionary to a set. Originally a Dictionary had to be used so we could call TryGetValue to get a reference to the pooled string. Now that more recent versions of dotnet provide a TryGetValue on HashSet, we can use a set directly without the memory wasted by having to store both keys and values in a dictionary.
This commit is contained in:
@@ -122,10 +122,10 @@ namespace OpenRA.Network
|
||||
LastSyncFrame = rs.ReadInt32();
|
||||
lastSyncPacket = rs.ReadBytes(Order.SyncHashOrderLength);
|
||||
|
||||
var globalSettings = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength));
|
||||
var globalSettings = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength), $"{filepath}:globalSettings");
|
||||
GlobalSettings = Session.Global.Deserialize(globalSettings[0].Value);
|
||||
|
||||
var slots = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength));
|
||||
var slots = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength), $"{filepath}:slots");
|
||||
Slots = new Dictionary<string, Session.Slot>();
|
||||
foreach (var s in slots)
|
||||
{
|
||||
@@ -133,7 +133,7 @@ namespace OpenRA.Network
|
||||
Slots.Add(slot.PlayerReference, slot);
|
||||
}
|
||||
|
||||
var slotClients = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength));
|
||||
var slotClients = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength), $"{filepath}:slotClients");
|
||||
SlotClients = new Dictionary<string, SlotClient>();
|
||||
foreach (var s in slotClients)
|
||||
{
|
||||
@@ -144,7 +144,7 @@ namespace OpenRA.Network
|
||||
if (rs.Position != traitDataOffset || rs.ReadInt32() != TraitDataMarker)
|
||||
throw new InvalidDataException("Invalid orasav file");
|
||||
|
||||
var traitData = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength));
|
||||
var traitData = MiniYaml.FromString(rs.ReadLengthPrefixedString(Encoding.UTF8, Connection.MaxOrderLength), $"{filepath}:traitData");
|
||||
foreach (var td in traitData)
|
||||
TraitData.Add(Exts.ParseInt32Invariant(td.Key), td.Value);
|
||||
|
||||
|
||||
@@ -20,10 +20,10 @@ namespace OpenRA.Network
|
||||
public string Version;
|
||||
public string AuthToken;
|
||||
|
||||
public static HandshakeRequest Deserialize(string data)
|
||||
public static HandshakeRequest Deserialize(string data, string name)
|
||||
{
|
||||
var handshake = new HandshakeRequest();
|
||||
FieldLoader.Load(handshake, MiniYaml.FromString(data).First().Value);
|
||||
FieldLoader.Load(handshake, MiniYaml.FromString(data, name).First().Value);
|
||||
return handshake;
|
||||
}
|
||||
|
||||
@@ -51,14 +51,14 @@ namespace OpenRA.Network
|
||||
[FieldLoader.Ignore]
|
||||
public Session.Client Client;
|
||||
|
||||
public static HandshakeResponse Deserialize(string data)
|
||||
public static HandshakeResponse Deserialize(string data, string name)
|
||||
{
|
||||
var handshake = new HandshakeResponse
|
||||
{
|
||||
Client = new Session.Client()
|
||||
};
|
||||
|
||||
var ys = MiniYaml.FromString(data);
|
||||
var ys = MiniYaml.FromString(data, name);
|
||||
foreach (var y in ys)
|
||||
{
|
||||
switch (y.Key)
|
||||
|
||||
@@ -69,7 +69,7 @@ namespace OpenRA.Network
|
||||
if (o.OrderString == "StartGame")
|
||||
IsValid = true;
|
||||
else if (o.OrderString == "SyncInfo" && !IsValid)
|
||||
LobbyInfo = Session.Deserialize(o.TargetString);
|
||||
LobbyInfo = Session.Deserialize(o.TargetString, o.OrderString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,13 +41,13 @@ namespace OpenRA.Network
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Session Deserialize(string data)
|
||||
public static Session Deserialize(string data, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
var session = new Session();
|
||||
|
||||
var nodes = MiniYaml.FromString(data);
|
||||
var nodes = MiniYaml.FromString(data, name);
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
var strings = node.Key.Split('@');
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace OpenRA.Network
|
||||
if (string.IsNullOrEmpty(order.TargetString))
|
||||
break;
|
||||
|
||||
var yaml = MiniYaml.FromString(order.TargetString);
|
||||
var yaml = MiniYaml.FromString(order.TargetString, order.OrderString);
|
||||
foreach (var node in yaml)
|
||||
{
|
||||
var localizedMessage = new LocalizedMessage(node.Value);
|
||||
@@ -183,7 +183,7 @@ namespace OpenRA.Network
|
||||
|
||||
if (!string.IsNullOrEmpty(order.TargetString))
|
||||
{
|
||||
var data = MiniYaml.FromString(order.TargetString);
|
||||
var data = MiniYaml.FromString(order.TargetString, order.OrderString);
|
||||
var saveLastOrdersFrame = data.FirstOrDefault(n => n.Key == "SaveLastOrdersFrame");
|
||||
if (saveLastOrdersFrame != null)
|
||||
orderManager.GameSaveLastFrame =
|
||||
@@ -203,7 +203,7 @@ namespace OpenRA.Network
|
||||
|
||||
case "SaveTraitData":
|
||||
{
|
||||
var data = MiniYaml.FromString(order.TargetString)[0];
|
||||
var data = MiniYaml.FromString(order.TargetString, order.OrderString)[0];
|
||||
var traitIndex = Exts.ParseInt32Invariant(data.Key);
|
||||
|
||||
world?.AddGameSaveTraitData(traitIndex, data.Value);
|
||||
@@ -244,7 +244,7 @@ namespace OpenRA.Network
|
||||
{
|
||||
// Switch to the server's mod if we need and are able to
|
||||
var mod = Game.ModData.Manifest;
|
||||
var request = HandshakeRequest.Deserialize(order.TargetString);
|
||||
var request = HandshakeRequest.Deserialize(order.TargetString, order.OrderString);
|
||||
|
||||
var externalKey = ExternalMod.MakeKey(request.Mod, request.Version);
|
||||
if ((request.Mod != mod.Id || request.Version != mod.Metadata.Version) &&
|
||||
@@ -312,7 +312,7 @@ namespace OpenRA.Network
|
||||
|
||||
case "SyncInfo":
|
||||
{
|
||||
orderManager.LobbyInfo = Session.Deserialize(order.TargetString);
|
||||
orderManager.LobbyInfo = Session.Deserialize(order.TargetString, order.OrderString);
|
||||
Game.SyncLobbyInfo();
|
||||
break;
|
||||
}
|
||||
@@ -320,7 +320,7 @@ namespace OpenRA.Network
|
||||
case "SyncLobbyClients":
|
||||
{
|
||||
var clients = new List<Session.Client>();
|
||||
var nodes = MiniYaml.FromString(order.TargetString);
|
||||
var nodes = MiniYaml.FromString(order.TargetString, order.OrderString);
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
var strings = node.Key.Split('@');
|
||||
@@ -336,7 +336,7 @@ namespace OpenRA.Network
|
||||
case "SyncLobbySlots":
|
||||
{
|
||||
var slots = new Dictionary<string, Session.Slot>();
|
||||
var nodes = MiniYaml.FromString(order.TargetString);
|
||||
var nodes = MiniYaml.FromString(order.TargetString, order.OrderString);
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
var strings = node.Key.Split('@');
|
||||
@@ -354,7 +354,7 @@ namespace OpenRA.Network
|
||||
|
||||
case "SyncLobbyGlobalSettings":
|
||||
{
|
||||
var nodes = MiniYaml.FromString(order.TargetString);
|
||||
var nodes = MiniYaml.FromString(order.TargetString, order.OrderString);
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
var strings = node.Key.Split('@');
|
||||
@@ -368,7 +368,7 @@ namespace OpenRA.Network
|
||||
|
||||
case "SyncConnectionQuality":
|
||||
{
|
||||
var nodes = MiniYaml.FromString(order.TargetString);
|
||||
var nodes = MiniYaml.FromString(order.TargetString, order.OrderString);
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
var strings = node.Key.Split('@');
|
||||
|
||||
Reference in New Issue
Block a user