Skip to content

Commit bf0e71b

Browse files
committed
Added overflow and dispose checks to ResourcePool
1 parent f140dfa commit bf0e71b

File tree

1 file changed

+54
-9
lines changed

1 file changed

+54
-9
lines changed

MLAPI/NetworkingManagerComponents/Binary/ResourcePool.cs

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4+
using MLAPI.Logging;
45

56
namespace MLAPI.Serialization
67
{
@@ -9,6 +10,8 @@ namespace MLAPI.Serialization
910
/// </summary>
1011
public static class BitStreamPool
1112
{
13+
private static byte createdStreams = 0;
14+
private static readonly Queue<WeakReference> overflowStreams = new Queue<WeakReference>();
1215
private static readonly Queue<PooledBitStream> streams = new Queue<PooledBitStream>();
1316

1417
/// <summary>
@@ -17,7 +20,21 @@ public static class BitStreamPool
1720
/// <returns>An expandable PooledBitStream</returns>
1821
public static PooledBitStream GetStream()
1922
{
20-
if (streams.Count == 0) return new PooledBitStream();
23+
if (overflowStreams.Count > 0)
24+
{
25+
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Retrieving PooledBitStream from overflow pool. Recent burst?");
26+
WeakReference weakStream;
27+
while (!(weakStream = overflowStreams.Dequeue()).IsAlive) ;
28+
if (weakStream.IsAlive) return (PooledBitStream)weakStream.Target;
29+
}
30+
31+
if (streams.Count == 0)
32+
{
33+
if (createdStreams == 254) if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("255 streams have been created. Did you forget to dispose?");
34+
else if (createdStreams < 255) createdStreams++;
35+
36+
return new PooledBitStream();
37+
}
2138

2239
PooledBitStream stream = streams.Dequeue();
2340
stream.SetLength(0);
@@ -32,7 +49,19 @@ public static PooledBitStream GetStream()
3249
/// <param name="stream">The stream to put in the pool</param>
3350
public static void PutBackInPool(PooledBitStream stream)
3451
{
35-
streams.Enqueue(stream);
52+
if (streams.Count > 16)
53+
{
54+
//The user just created lots of streams without returning them in between.
55+
//Streams are essentially byte array wrappers. This is valuable memory.
56+
//Thus we put this stream as a weak reference incase of another burst
57+
//But still leave it to GC
58+
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Putting PooledBitStream into overflow pool. Did you forget to dispose?");
59+
overflowStreams.Enqueue(new WeakReference(stream));
60+
}
61+
else
62+
{
63+
streams.Enqueue(stream);
64+
}
3665
}
3766
}
3867

@@ -41,6 +70,7 @@ public static void PutBackInPool(PooledBitStream stream)
4170
/// </summary>
4271
public static class BitWriterPool
4372
{
73+
private static byte createdWriters = 0;
4474
private static readonly Queue<PooledBitWriter> writers = new Queue<PooledBitWriter>();
4575

4676
/// <summary>
@@ -50,21 +80,28 @@ public static class BitWriterPool
5080
/// <returns>A PooledBitWriter</returns>
5181
public static PooledBitWriter GetWriter(Stream stream)
5282
{
53-
if (writers.Count == 0) return new PooledBitWriter(stream);
83+
if (writers.Count == 0)
84+
{
85+
if (createdWriters == 254) if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("255 writers have been created. Did you forget to dispose?");
86+
else if (createdWriters < 255) createdWriters++;
87+
88+
return new PooledBitWriter(stream);
89+
}
5490

5591
PooledBitWriter writer = writers.Dequeue();
5692
writer.SetStream(stream);
57-
93+
5894
return writer;
5995
}
6096

6197
/// <summary>
6298
/// Puts a PooledBitWriter back into the pool
6399
/// </summary>
64-
/// <param name="stream">The writer to put in the pool</param>
100+
/// <param name="writer">The writer to put in the pool</param>
65101
public static void PutBackInPool(PooledBitWriter writer)
66102
{
67-
writers.Enqueue(writer);
103+
if (writers.Count < 64) writers.Enqueue(writer);
104+
else if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("BitWriterPool already has 64 queued. Throwing to GC. Did you forget to dispose?");
68105
}
69106
}
70107

@@ -73,6 +110,7 @@ public static void PutBackInPool(PooledBitWriter writer)
73110
/// </summary>
74111
public static class BitReaderPool
75112
{
113+
private static byte createdReaders = 0;
76114
private static readonly Queue<PooledBitReader> readers = new Queue<PooledBitReader>();
77115

78116
/// <summary>
@@ -82,7 +120,13 @@ public static class BitReaderPool
82120
/// <returns>A PooledBitReader</returns>
83121
public static PooledBitReader GetReader(Stream stream)
84122
{
85-
if (readers.Count == 0) return new PooledBitReader(stream);
123+
if (readers.Count == 0)
124+
{
125+
if (createdReaders == 254) if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("255 readers have been created. Did you forget to dispose?");
126+
else if (createdReaders < 255) createdReaders++;
127+
128+
return new PooledBitReader(stream);
129+
}
86130

87131
PooledBitReader reader = readers.Dequeue();
88132
reader.SetStream(stream);
@@ -93,10 +137,11 @@ public static PooledBitReader GetReader(Stream stream)
93137
/// <summary>
94138
/// Puts a PooledBitReader back into the pool
95139
/// </summary>
96-
/// <param name="stream">The reader to put in the pool</param>
140+
/// <param name="reader">The reader to put in the pool</param>
97141
public static void PutBackInPool(PooledBitReader reader)
98142
{
99-
readers.Enqueue(reader);
143+
if (readers.Count < 64) readers.Enqueue(reader);
144+
else if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("BitReaderPool already has 64 queued. Throwing to GC. Did you forget to dispose?");
100145
}
101146
}
102147

0 commit comments

Comments
 (0)