From 9a1d62e382309ac3fcbfd62911b954974b2f00f3 Mon Sep 17 00:00:00 2001 From: John L Date: Tue, 22 Aug 2017 17:27:19 -0700 Subject: [PATCH] Fix per frame memory allocation in stats manager and social manager (#113) --- .../api/Social/Manager/MockSocialManager.cs | 15 ++++++++++++--- .../Source/api/Social/Manager/SocialManager.cs | 15 +++++++++++---- .../Source/api/Stats/Manager/MockStatsManager.cs | 11 ++++++++++- .../Source/api/Stats/Manager/StatsManager.cs | 12 +++++++++++- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/CSharpSource/Source/api/Social/Manager/MockSocialManager.cs b/CSharpSource/Source/api/Social/Manager/MockSocialManager.cs index ff25a02d..42da1659 100644 --- a/CSharpSource/Source/api/Social/Manager/MockSocialManager.cs +++ b/CSharpSource/Source/api/Social/Manager/MockSocialManager.cs @@ -15,6 +15,7 @@ public class MockSocialManager : ISocialManager { private static Random rng = new Random(); private List events; + private static readonly List emptyEventsList = new List(); internal MockSocialManager() { @@ -132,9 +133,17 @@ private void InitUserForOnlinePresence(ref XboxSocialUser groupUser) public IList DoWork() { - List currentEvents = this.events; - this.events = new List(); - return currentEvents; + List returnList = null; + if (this.events.Count > 0) + { + returnList = this.events; + this.events = new List(); + } + else + { + returnList = emptyEventsList; + } + return returnList; } private static XboxSocialUser CreateUser(ulong id = 0) diff --git a/CSharpSource/Source/api/Social/Manager/SocialManager.cs b/CSharpSource/Source/api/Social/Manager/SocialManager.cs index 5016bdfd..2c3218d1 100644 --- a/CSharpSource/Source/api/Social/Manager/SocialManager.cs +++ b/CSharpSource/Source/api/Social/Manager/SocialManager.cs @@ -22,6 +22,7 @@ public class SocialManager : ISocialManager private readonly Dictionary> userGroupsMap = new Dictionary>(new XboxUserIdEqualityComparer()); private Queue eventQueue = new Queue(); + private static readonly List emptyEventList = new List(); private SocialManager() { @@ -180,13 +181,19 @@ public void UpdateUserGroup(XboxLiveUser user, XboxSocialUserGroup group, List DoWork() { - Queue eventQueueSnapshot = this.eventQueue; - this.eventQueue = new Queue(); - List events; lock (this.syncRoot) { - events = eventQueueSnapshot.ToList(); + if (this.eventQueue.Count > 0) + { + events = this.eventQueue.ToList(); + this.eventQueue.Clear(); + } + else + { + events = emptyEventList; + } + foreach (SocialGraph graph in this.userGraphs.Values) { graph.DoWork(events); diff --git a/CSharpSource/Source/api/Stats/Manager/MockStatsManager.cs b/CSharpSource/Source/api/Stats/Manager/MockStatsManager.cs index 4245c65f..eefc165c 100644 --- a/CSharpSource/Source/api/Stats/Manager/MockStatsManager.cs +++ b/CSharpSource/Source/api/Stats/Manager/MockStatsManager.cs @@ -13,6 +13,7 @@ class MockStatsManager : IStatsManager { private StatsValueDocument statValueDocument; private List statEventList; + private static readonly List emptyStatEventList = new List(); private MockLeaderboardService leaderboardService; internal MockStatsManager() @@ -97,7 +98,15 @@ public void RequestFlushToService(XboxLiveUser user, bool isHighPriority = false public List DoWork() { - var copyList = this.statEventList.ToList(); + List copyList = null; + if (this.statEventList.Count > 0) + { + copyList = this.statEventList.ToList(); + } + else + { + copyList = emptyStatEventList; + } this.statValueDocument.DoWork(); this.statEventList.Clear(); diff --git a/CSharpSource/Source/api/Stats/Manager/StatsManager.cs b/CSharpSource/Source/api/Stats/Manager/StatsManager.cs index cb32788c..f3245781 100644 --- a/CSharpSource/Source/api/Stats/Manager/StatsManager.cs +++ b/CSharpSource/Source/api/Stats/Manager/StatsManager.cs @@ -20,6 +20,7 @@ public class StatsManager : IStatsManager private readonly Dictionary userDocumentMap; private readonly List eventList; + private static readonly List emptyEventList = new List(); private readonly CallBufferTimer statTimer; private readonly CallBufferTimer statPriorityTimer; @@ -241,7 +242,16 @@ public List DoWork() { lock (this.userDocumentMap) { - var copyList = this.eventList.ToList(); + List copyList = null; + if (this.eventList.Count > 0) + { + copyList = this.eventList.ToList(); + } + else + { + copyList = emptyEventList; + } + foreach (var userContextPair in this.userDocumentMap) { userContextPair.Value.DoWork();