Skip to content

Commit a166e54

Browse files
authored
Merge | Merge references to PacketHandle (#3355)
* Port PacketHandle to netfx * Remove PacketHandle alias shim * Align netfx use of PacketHandle * Merge IsPacketEmpty * Merge ReleasePacket * Merge ReadAsync, ReadSyncOverAsync Also move ReadSyncOverAsync down in netcore's TdsParserStateObjectNative to aid later merge * Merge IsFailedHandle * Merge SniPacketGetData * Merge EmptyReadPacket Also reorder member in TdsParserStateObjectNative to simplify later merge * Merge CheckPacket * Merge WritePacket, IsValidPacket * Merge GetResetWritePacket * Merge ClearAllWritePackets, AddPacketToPendingList, RemovePacketFromPendingList * Improve diff between versions of TdsParserStateObjectNative * PR feedback from #3353 - format IsValidPacket * Address merge conflicts * Merge DisposePacketCache This also allows _writePacketCache to be migrated to TdsParserStateObjectNative in netfx.
1 parent 01f85bf commit a166e54

File tree

5 files changed

+224
-199
lines changed

5 files changed

+224
-199
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObject.netcore.cs

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ internal abstract void CreatePhysicalSNIHandle(
8686

8787
internal abstract void AssignPendingDNSInfo(string userProtocol, string DNSCacheKey, ref SQLDNSInfo pendingDNSInfo);
8888

89-
internal abstract bool IsFailedHandle();
90-
9189
protected abstract void CreateSessionHandle(TdsParserStateObject physicalConnection, bool async);
9290

9391
protected abstract void FreeGcHandle(int remaining, bool release);
@@ -98,28 +96,8 @@ internal abstract void CreatePhysicalSNIHandle(
9896

9997
internal abstract void Dispose();
10098

101-
internal abstract void DisposePacketCache();
102-
103-
internal abstract bool IsPacketEmpty(PacketHandle readPacket);
104-
105-
internal abstract PacketHandle ReadSyncOverAsync(int timeoutRemaining, out uint error);
106-
107-
internal abstract PacketHandle ReadAsync(SessionHandle handle, out uint error);
108-
10999
internal abstract uint CheckConnection();
110100

111-
internal abstract void ReleasePacket(PacketHandle syncReadPacket);
112-
113-
protected abstract uint SniPacketGetData(PacketHandle packet, byte[] _inBuff, ref uint dataSize);
114-
115-
internal abstract PacketHandle GetResetWritePacket(int dataSize);
116-
117-
internal abstract void ClearAllWritePackets();
118-
119-
internal abstract PacketHandle AddPacketToPendingList(PacketHandle packet);
120-
121-
protected abstract void RemovePacketFromPendingList(PacketHandle pointer);
122-
123101
internal int DecrementPendingCallbacks(bool release)
124102
{
125103
int remaining = Interlocked.Decrement(ref _pendingCallbacks);
@@ -412,8 +390,6 @@ public void ReadAsyncCallback(IntPtr key, PacketHandle packet, uint error)
412390
}
413391
}
414392

415-
protected abstract bool CheckPacket(PacketHandle packet, TaskCompletionSource<object> source);
416-
417393
public void WriteAsyncCallback(PacketHandle packet, uint sniError) =>
418394
WriteAsyncCallback(IntPtr.Zero, packet, sniError);
419395

@@ -719,10 +695,6 @@ private Task SNIWritePacket(PacketHandle packet, out uint sniError, bool canAccu
719695
return task;
720696
}
721697

722-
internal abstract bool IsValidPacket(PacketHandle packetPointer);
723-
724-
internal abstract uint WritePacket(PacketHandle packet, bool sync);
725-
726698
// Sends an attention signal - executing thread will consume attn.
727699
internal void SendAttention(bool mustTakeWriteLock = false, bool asyncClose = false)
728700
{
@@ -871,7 +843,5 @@ private void SniWriteStatisticsAndTracing()
871843
statistics.RequestNetworkServerTimer();
872844
}
873845
}
874-
875-
protected abstract PacketHandle EmptyReadPacket { get; }
876846
}
877847
}

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObjectNative.cs

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,34 @@ private enum NativeProtocols
4343
internal SNIPacket _sniAsyncAttnPacket = null; // Packet to use to send Attn
4444
private readonly WritePacketCache _writePacketCache = new WritePacketCache(); // Store write packets that are ready to be re-used
4545

46-
public TdsParserStateObjectNative(TdsParser parser) : base(parser) { }
47-
4846
private GCHandle _gcHandle; // keeps this object alive until we're closed.
4947

50-
private Dictionary<IntPtr, SNIPacket> _pendingWritePackets = new Dictionary<IntPtr, SNIPacket>(); // Stores write packets that have been sent to SNI, but have not yet finished writing (i.e. we are waiting for SNI's callback)
48+
private readonly Dictionary<IntPtr, SNIPacket> _pendingWritePackets = new Dictionary<IntPtr, SNIPacket>(); // Stores write packets that have been sent to SNI, but have not yet finished writing (i.e. we are waiting for SNI's callback)
5149

52-
internal TdsParserStateObjectNative(TdsParser parser, TdsParserStateObject physicalConnection, bool async) :
53-
base(parser, physicalConnection, async)
50+
internal TdsParserStateObjectNative(TdsParser parser, TdsParserStateObject physicalConnection, bool async)
51+
: base(parser, physicalConnection, async)
5452
{
5553
}
5654

55+
public TdsParserStateObjectNative(TdsParser parser)
56+
: base(parser)
57+
{
58+
}
59+
60+
////////////////
61+
// Properties //
62+
////////////////
63+
5764
internal SNIHandle Handle => _sessionHandle;
5865

5966
internal override uint Status => _sessionHandle != null ? _sessionHandle.Status : TdsEnums.SNI_UNINITIALIZED;
6067

6168
internal override SessionHandle SessionHandle => SessionHandle.FromNativeHandle(_sessionHandle);
6269

70+
protected override PacketHandle EmptyReadPacket => PacketHandle.FromNativePointer(default);
71+
72+
internal override Guid? SessionId => default;
73+
6374
protected override void CreateSessionHandle(TdsParserStateObject physicalConnection, bool async)
6475
{
6576
Debug.Assert(physicalConnection is TdsParserStateObjectNative, "Expected a stateObject of type " + this.GetType());
@@ -256,22 +267,6 @@ protected override void FreeGcHandle(int remaining, bool release)
256267

257268
internal override bool IsFailedHandle() => _sessionHandle.Status != TdsEnums.SNI_SUCCESS;
258269

259-
internal override PacketHandle ReadSyncOverAsync(int timeoutRemaining, out uint error)
260-
{
261-
SNIHandle handle = Handle;
262-
if (handle == null)
263-
{
264-
throw ADP.ClosedConnectionError();
265-
}
266-
IntPtr readPacketPtr = IntPtr.Zero;
267-
error = SniNativeWrapper.SniReadSyncOverAsync(handle, ref readPacketPtr, GetTimeoutRemaining());
268-
return PacketHandle.FromNativePointer(readPacketPtr);
269-
}
270-
271-
protected override PacketHandle EmptyReadPacket => PacketHandle.FromNativePointer(default);
272-
273-
internal override Guid? SessionId => default;
274-
275270
internal override bool IsPacketEmpty(PacketHandle readPacket)
276271
{
277272
Debug.Assert(readPacket.Type == PacketHandle.NativePointerType || readPacket.Type == 0, "unexpected packet type when requiring NativePointer");
@@ -298,6 +293,14 @@ internal override PacketHandle ReadAsync(SessionHandle handle, out uint error)
298293
return PacketHandle.FromNativePointer(readPacketPtr);
299294
}
300295

296+
internal override PacketHandle ReadSyncOverAsync(int timeoutRemaining, out uint error)
297+
{
298+
SNIHandle handle = Handle ?? throw ADP.ClosedConnectionError();
299+
IntPtr readPacketPtr = IntPtr.Zero;
300+
error = SniNativeWrapper.SniReadSyncOverAsync(handle, ref readPacketPtr, GetTimeoutRemaining());
301+
return PacketHandle.FromNativePointer(readPacketPtr);
302+
}
303+
301304
internal override PacketHandle CreateAndSetAttentionPacket()
302305
{
303306
SNIHandle handle = Handle;
@@ -332,11 +335,9 @@ internal override PacketHandle AddPacketToPendingList(PacketHandle packetToAdd)
332335
internal override bool IsValidPacket(PacketHandle packetPointer)
333336
{
334337
Debug.Assert(packetPointer.Type == PacketHandle.NativePointerType || packetPointer.Type == PacketHandle.NativePacketType, "unexpected packet type when requiring NativePointer");
335-
return (
336-
(packetPointer.Type == PacketHandle.NativePointerType && packetPointer.NativePointer != IntPtr.Zero)
337-
||
338-
(packetPointer.Type == PacketHandle.NativePacketType && packetPointer.NativePacket != null)
339-
);
338+
339+
return (packetPointer.Type == PacketHandle.NativePointerType && packetPointer.NativePointer != IntPtr.Zero)
340+
|| (packetPointer.Type == PacketHandle.NativePacketType && packetPointer.NativePacket != null);
340341
}
341342

342343
internal override PacketHandle GetResetWritePacket(int dataSize)
@@ -444,8 +445,16 @@ internal override void DisposePacketCache()
444445
{
445446
lock (_writePacketLockObject)
446447
{
447-
_writePacketCache.Dispose();
448-
// Do not set _writePacketCache to null, just in case a WriteAsyncCallback completes after this point
448+
#if NETFRAMEWORK
449+
RuntimeHelpers.PrepareConstrainedRegions();
450+
#endif
451+
try
452+
{ }
453+
finally
454+
{
455+
_writePacketCache.Dispose();
456+
// Do not set _writePacketCache to null, just in case a WriteAsyncCallback completes after this point
457+
}
449458
}
450459
}
451460

0 commit comments

Comments
 (0)