Skip to content

Commit 4a67b09

Browse files
committed
change lockfree to locks because of possible ABA problem
1 parent e96bb61 commit 4a67b09

File tree

2 files changed

+19
-27
lines changed

2 files changed

+19
-27
lines changed

LiteNetLib/NetManager.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ private struct IncomingData
179179
private int _lastPeerId;
180180
private readonly Queue<int> _peerIds;
181181
private byte _channelsCount = 1;
182+
private readonly object _eventLock = new object();
182183

183184
internal readonly NetPacketPool NetPacketPool;
184185

@@ -572,15 +573,14 @@ private void CreateEvent(
572573
else if (type == NetEvent.EType.MessageDelivered)
573574
unsyncEvent = UnsyncedDeliveryEvent;
574575

575-
do
576+
lock(_eventLock)
576577
{
577578
evt = _netEventPoolHead;
578579
if (evt == null)
579-
{
580580
evt = new NetEvent(this);
581-
break;
582-
}
583-
} while (evt != Interlocked.CompareExchange(ref _netEventPoolHead, evt.Next, evt));
581+
else
582+
_netEventPoolHead = evt.Next;
583+
}
584584

585585
evt.Type = type;
586586
evt.DataReader.SetSource(readerSource, readerSource == null ? 0 : readerSource.GetHeaderSize());
@@ -657,10 +657,11 @@ internal void RecycleEvent(NetEvent evt)
657657
evt.ErrorCode = 0;
658658
evt.RemoteEndPoint = null;
659659
evt.ConnectionRequest = null;
660-
do
660+
lock(_eventLock)
661661
{
662662
evt.Next = _netEventPoolHead;
663-
} while (evt.Next != Interlocked.CompareExchange(ref _netEventPoolHead, evt, evt.Next));
663+
_netEventPoolHead = evt;
664+
}
664665
}
665666

666667
//Update function
@@ -1131,15 +1132,14 @@ private void DataReceived(NetPacket packet, IPEndPoint remoteEndPoint)
11311132
internal void CreateReceiveEvent(NetPacket packet, DeliveryMethod method, int headerSize, NetPeer fromPeer)
11321133
{
11331134
NetEvent evt;
1134-
do
1135+
lock (_eventLock)
11351136
{
11361137
evt = _netEventPoolHead;
11371138
if (evt == null)
1138-
{
11391139
evt = new NetEvent(this);
1140-
break;
1141-
}
1142-
} while (evt != Interlocked.CompareExchange(ref _netEventPoolHead, evt.Next, evt));
1140+
else
1141+
_netEventPoolHead = evt.Next;
1142+
}
11431143
evt.Type = NetEvent.EType.Receive;
11441144
evt.DataReader.SetSource(packet, headerSize);
11451145
evt.Peer = fromPeer;

LiteNetLib/NetPacketPool.cs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ internal sealed class NetPacketPool
77
{
88
private NetPacket _head;
99
private int _count;
10+
private readonly object _lock = new object();
1011

1112
public NetPacket GetWithData(PacketProperty property, byte[] data, int start, int length)
1213
{
@@ -38,16 +39,13 @@ public NetPacket GetPacket(int size)
3839
return new NetPacket(size);
3940

4041
NetPacket packet;
41-
do
42+
lock (_lock)
4243
{
4344
packet = _head;
4445
if (packet == null)
4546
return new NetPacket(size);
46-
} while (packet != Interlocked.CompareExchange(ref _head, packet.Next, packet));
47-
48-
#if DEBUG_REFCOUNT
49-
Interlocked.Increment(ref packet.RefCount);
50-
#endif
47+
_head = _head.Next;
48+
}
5149

5250
Interlocked.Decrement(ref _count);
5351
packet.Size = size;
@@ -64,21 +62,15 @@ public void Recycle(NetPacket packet)
6462
return;
6563
}
6664

67-
#if DEBUG_REFCOUNT
68-
int result = Interlocked.Decrement(ref packet.RefCount);
69-
if (result != 0)
70-
NetDebug.WriteError("PacketRefCount invalid: {0}, {1}", result, Environment.StackTrace);
71-
#endif
72-
7365
Interlocked.Increment(ref _count);
7466

7567
//Clean fragmented flag
7668
packet.RawData[0] = 0;
77-
78-
do
69+
lock (_lock)
7970
{
8071
packet.Next = _head;
81-
} while (packet.Next != Interlocked.CompareExchange(ref _head, packet, packet.Next));
72+
_head = packet;
73+
}
8274
}
8375
}
8476
}

0 commit comments

Comments
 (0)