public void TestWriterIsReused02() { UnsafeWriter firstWriter = null, secondWriter = null; var thread = new Thread(() => { UnsafeWriter.AllowUnsafeWriterCaching = true; try { using (var cookie = UnsafeWriter.NewThreadLocalWriter()) { firstWriter = cookie.Writer; } using (var cookie = UnsafeWriter.NewThreadLocalWriterNoCaching()) { secondWriter = cookie.Writer; } } finally { UnsafeWriter.AllowUnsafeWriterCaching = false; } }); thread.Start(); thread.Join(); Assert.IsNotNull(firstWriter, "firstWriter != null"); Assert.IsNotNull(secondWriter, "secondWriter != null"); Assert.IsTrue(ReferenceEquals(firstWriter, secondWriter), "object.ReferenceEquals(firstWriter, secondWriter)"); }
private void SendAck(long seqN) { try { using (var cookie = UnsafeWriter.NewThreadLocalWriterNoCaching()) { cookie.Writer.Write(ACK_MSG_LEN); cookie.Writer.Write(seqN); cookie.CopyTo(myAckPkgHeader); } lock (mySocketSendLock) Socket.Send(myAckPkgHeader); } catch (ObjectDisposedException) { Log.Verbose($"{Id}: Socket was disposed during ACK, seqn = {seqN}"); } catch (SocketException e) { // looks like this does not deserve a warn, as the only thing that can happen is a fatal socket failure anyway, and that will likely be reported properly from other threads Log.Verbose(e, $"{Id}: ${e.GetType()} raised during ACK, seqn = {seqN}"); } catch (Exception e) { Log.Warn(e, $"{Id}: {e.GetType()} raised during ACK, seqn = {seqN}"); } }
private void Ping() { if (BackwardsCompatibleWireFormat) { return; } try { if (!ConnectionEstablished(myCurrentTimeStamp, myCounterpartNotionTimestamp)) { if (HeartbeatAlive.Value) // log only on change { Log.Trace()?.Log($"Disconnect detected while sending PING {Id}: " + $"currentTimeStamp: {myCurrentTimeStamp}, " + $"counterpartTimestamp: {myCounterpartTimestamp}, " + $"counterpartNotionTimestamp: {myCounterpartNotionTimestamp}"); } HeartbeatAlive.Value = false; } using (var cookie = UnsafeWriter.NewThreadLocalWriterNoCaching()) { cookie.Writer.Write(PING_LEN); cookie.Writer.Write(myCurrentTimeStamp); cookie.Writer.Write(myCounterpartTimestamp); cookie.CopyTo(myPingPkgHeader); } lock (mySocketSendLock) Socket.Send(myPingPkgHeader); ++myCurrentTimeStamp; } catch (ObjectDisposedException) { Log.Verbose($"{Id}: Socket was disposed during PING"); } catch (Exception e) { Log.Warn(e, $"{Id}: {e.GetType()} raised during PING"); } }
public void TestWriterIsNotReused01() { UnsafeWriter firstWriter = null, secondWriter = null; var thread = new Thread(() => { using (var cookie = UnsafeWriter.NewThreadLocalWriterNoCaching()) { firstWriter = cookie.Writer; } using (var cookie = UnsafeWriter.NewThreadLocalWriterNoCaching()) { secondWriter = cookie.Writer; } }); thread.Start(); thread.Join(); Assert.IsNotNull(firstWriter, "firstWriter != null"); Assert.IsNotNull(secondWriter, "secondWriter != null"); Assert.IsFalse(ReferenceEquals(firstWriter, secondWriter), "object.ReferenceEquals(firstWriter, secondWriter)"); }