Skip to content

Commit 5750778

Browse files
author
Emile Joubert
committed
Avoid flow control race
1 parent 4d79ded commit 5750778

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

projects/client/RabbitMQ.Client/src/client/impl/ModelBase.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public abstract class ModelBase : IFullModel
8585
private BasicRecoverOkEventHandler m_basicRecoverOk;
8686

8787
public ManualResetEvent m_flowControlBlock = new ManualResetEvent(true);
88+
private Object flowSendLock = new object();
8889

8990
public event ModelShutdownEventHandler ModelShutdown
9091
{
@@ -373,10 +374,18 @@ public bool IsOpen
373374

374375
public void ModelSend(MethodBase method, ContentHeaderBase header, byte[] body)
375376
{
376-
if (method.HasContent) {
377-
m_flowControlBlock.WaitOne();
377+
if (method.HasContent)
378+
{
379+
lock (flowSendLock)
380+
{
381+
m_flowControlBlock.WaitOne();
382+
m_session.Transmit(new Command(method, header, body));
383+
}
384+
}
385+
else
386+
{
387+
m_session.Transmit(new Command(method, header, body));
378388
}
379-
m_session.Transmit(new Command(method, header, body));
380389
}
381390

382391
public MethodBase ModelRpc(MethodBase method, ContentHeaderBase header, byte[] body)
@@ -451,10 +460,16 @@ public void HandleBasicReturn(ushort replyCode,
451460
public void HandleChannelFlow(bool active)
452461
{
453462
if (active)
463+
{
454464
m_flowControlBlock.Set();
465+
_Private_ChannelFlowOk(active);
466+
}
455467
else
456-
m_flowControlBlock.Reset();
457-
_Private_ChannelFlowOk(active);
468+
lock (flowSendLock)
469+
{
470+
m_flowControlBlock.Reset();
471+
_Private_ChannelFlowOk(active);
472+
}
458473
}
459474

460475
public void HandleConnectionStart(byte versionMajor,

0 commit comments

Comments
 (0)