18
18
19
19
namespace Microsoft . Data . SqlClient
20
20
{
21
- using PacketHandle = IntPtr ;
22
-
23
21
internal partial class TdsParserStateObject
24
22
{
25
23
protected SNIHandle _sessionHandle = null ; // the SNI handle we're to work on
@@ -138,27 +136,35 @@ internal void CreatePhysicalSNIHandle(
138
136
ipPreference , cachedDNSInfo , hostNameInCertificate ) ;
139
137
}
140
138
141
- internal bool IsPacketEmpty ( PacketHandle readPacket ) => readPacket == default ;
139
+ internal bool IsPacketEmpty ( PacketHandle readPacket )
140
+ {
141
+ Debug . Assert ( readPacket . Type = = PacketHandle . NativePointerType || readPacket . Type == 0 , "unexpected packet type when requiring NativePointer") ;
142
+ return IntPtr . Zero == readPacket . NativePointer ;
143
+ }
142
144
143
145
internal PacketHandle ReadSyncOverAsync ( int timeoutRemaining , out uint error )
144
146
{
145
147
SNIHandle handle = Handle ?? throw ADP . ClosedConnectionError ( ) ;
146
- PacketHandle readPacket = default ;
147
- error = SniNativeWrapper . SniReadSyncOverAsync ( handle , ref readPacket , timeoutRemaining ) ;
148
- return readPacket ;
148
+ IntPtr readPacketPtr = IntPtr . Zero ;
149
+ error = SniNativeWrapper . SniReadSyncOverAsync ( handle , ref readPacketPtr , timeoutRemaining ) ;
150
+ return PacketHandle . FromNativePointer ( readPacketPtr ) ;
149
151
}
150
152
151
153
internal PacketHandle ReadAsync ( SessionHandle handle , out uint error )
152
154
{
153
- PacketHandle readPacket = default ;
154
- error = SniNativeWrapper. SniReadAsync( handle . NativeHandle , ref readPacket ) ;
155
- return readPacket ;
155
+ IntPtr readPacketPtr = IntPtr . Zero ;
156
+ error = SniNativeWrapper . SniReadAsync ( handle . NativeHandle , ref readPacketPtr ) ;
157
+ return PacketHandle . FromNativePointer ( readPacketPtr ) ;
156
158
}
157
159
158
160
internal uint CheckConnection ( ) => SniNativeWrapper . SniCheckConnection ( Handle ) ;
159
161
160
- internal void ReleasePacket ( PacketHandle syncReadPacket ) => SniNativeWrapper . SniPacketRelease ( syncReadPacket ) ;
161
-
162
+ internal void ReleasePacket ( PacketHandle syncReadPacket )
163
+ {
164
+ Debug . Assert ( syncReadPacket . Type == PacketHandle . NativePointerType , "unexpected packet type when requiring NativePointer" ) ;
165
+ SniNativeWrapper . SniPacketRelease ( syncReadPacket . NativePointer ) ;
166
+ }
167
+
162
168
[ ReliabilityContract ( Consistency . WillNotCorruptState , Cer . Success ) ]
163
169
internal int DecrementPendingCallbacks ( bool release )
164
170
{
@@ -377,7 +383,13 @@ private void ReadSniError(TdsParserStateObject stateObj, uint error)
377
383
378
384
private uint GetSniPacket ( PacketHandle packet , ref uint dataSize )
379
385
{
380
- return SniNativeWrapper . SniPacketGetData ( packet , _inBuff , ref dataSize ) ;
386
+ return SniPacketGetData ( packet , _inBuff , ref dataSize ) ;
387
+ }
388
+
389
+ private uint SniPacketGetData ( PacketHandle packet , byte [ ] _inBuff , ref uint dataSize )
390
+ {
391
+ Debug . Assert ( packet . Type == PacketHandle . NativePointerType , "unexpected packet type when requiring NativePointer" ) ;
392
+ return SniNativeWrapper . SniPacketGetData ( packet . NativePointer , _inBuff , ref dataSize ) ;
381
393
}
382
394
383
395
public void ReadAsyncCallback ( IntPtr key , PacketHandle packet , uint error )
@@ -411,7 +423,7 @@ public void ReadAsyncCallback(IntPtr key, PacketHandle packet, uint error)
411
423
bool processFinallyBlock = true ;
412
424
try
413
425
{
414
- Debug . Assert ( IntPtr . Zero == packet || IntPtr . Zero != packet && source != null , "AsyncResult null on callback" ) ;
426
+ Debug . Assert ( CheckPacket ( packet , source ) , "AsyncResult null on callback" ) ;
415
427
416
428
if ( _parser . MARSOn )
417
429
{
@@ -481,6 +493,13 @@ public void ReadAsyncCallback(IntPtr key, PacketHandle packet, uint error)
481
493
}
482
494
}
483
495
496
+ private bool CheckPacket ( PacketHandle packet , TaskCompletionSource < object > source )
497
+ {
498
+ Debug . Assert ( packet . Type == PacketHandle . NativePointerType , "unexpected packet type when requiring NativePointer" ) ;
499
+ IntPtr ptr = packet . NativePointer ;
500
+ return IntPtr . Zero == ptr || IntPtr . Zero != ptr && source != null ;
501
+ }
502
+
484
503
#pragma warning disable 420 // a reference to a volatile field will not be treated as volatile
485
504
486
505
public void WriteAsyncCallback ( IntPtr key , PacketHandle packet , uint sniError )
@@ -654,7 +673,7 @@ internal Task WritePacket(byte flushMode, bool canAccumulate = false)
654
673
655
674
#pragma warning disable 420 // a reference to a volatile field will not be treated as volatile
656
675
657
- private Task SNIWritePacket ( SNIPacket packet , out uint sniError , bool canAccumulate , bool callerHasConnectionLock , bool asyncClose = false )
676
+ private Task SNIWritePacket ( PacketHandle packet , out uint sniError , bool canAccumulate , bool callerHasConnectionLock , bool asyncClose = false )
658
677
{
659
678
// Check for a stored exception
660
679
Exception delayedException = Interlocked . Exchange ( ref _delayedWriteAsyncCallbackException , null ) ;
@@ -696,7 +715,8 @@ private Task SNIWritePacket(SNIPacket packet, out uint sniError, bool canAccumul
696
715
}
697
716
finally
698
717
{
699
- sniError = SniNativeWrapper . SniWritePacket ( Handle , packet , sync ) ;
718
+ Debug . Assert ( packet . Type == PacketHandle . NativePacketType , "unexpected packet type when requiring NativePacket" ) ;
719
+ sniError = SniNativeWrapper . SniWritePacket ( Handle , packet . NativePacket , sync ) ;
700
720
}
701
721
702
722
if ( sniError == TdsEnums . SNI_SUCCESS_IO_PENDING )
@@ -790,7 +810,15 @@ private Task SNIWritePacket(SNIPacket packet, out uint sniError, bool canAccumul
790
810
791
811
#pragma warning restore 420
792
812
793
- internal bool IsValidPacket ( PacketHandle packetPointer ) => packetPointer != default ;
813
+ internal bool IsValidPacket ( PacketHandle packetPointer )
814
+ {
815
+ Debug . Assert ( packetPointer . Type == PacketHandle . NativePointerType || packetPointer . Type == PacketHandle . NativePacketType , "unexpected packet type when requiring NativePointer" ) ;
816
+ return (
817
+ ( packetPointer . Type == PacketHandle . NativePointerType && packetPointer . NativePointer != IntPtr . Zero )
818
+ ||
819
+ ( packetPointer . Type == PacketHandle . NativePacketType && packetPointer . NativePacket != null )
820
+ ) ;
821
+ }
794
822
795
823
// Sends an attention signal - executing thread will consume attn.
796
824
internal void SendAttention ( bool mustTakeWriteLock = false , bool asyncClose = false )
@@ -805,10 +833,7 @@ internal void SendAttention(bool mustTakeWriteLock = false, bool asyncClose = fa
805
833
return ;
806
834
}
807
835
808
- SNIPacket attnPacket = new SNIPacket ( Handle ) ;
809
- _sniAsyncAttnPacket = attnPacket ;
810
-
811
- SniNativeWrapper . SniPacketSetData ( attnPacket , SQL . AttentionHeader , TdsEnums . HEADER_LEN , null , null ) ;
836
+ PacketHandle attnPacket = CreateAndSetAttentionPacket ( ) ;
812
837
813
838
RuntimeHelpers . PrepareConstrainedRegions ( ) ;
814
839
try
@@ -868,11 +893,20 @@ internal void SendAttention(bool mustTakeWriteLock = false, bool asyncClose = fa
868
893
}
869
894
}
870
895
896
+ internal PacketHandle CreateAndSetAttentionPacket ( )
897
+ {
898
+ SNIPacket attnPacket = new SNIPacket ( Handle ) ;
899
+ _sniAsyncAttnPacket = attnPacket ;
900
+ SniNativeWrapper . SniPacketSetData ( attnPacket , SQL . AttentionHeader , TdsEnums . HEADER_LEN , null , null ) ;
901
+ return PacketHandle . FromNativePacket ( attnPacket ) ;
902
+ }
903
+
871
904
private Task WriteSni ( bool canAccumulate )
872
905
{
873
906
// Prepare packet, and write to packet.
874
- SNIPacket packet = GetResetWritePacket ( ) ;
875
- SniNativeWrapper . SniPacketSetData ( packet , _outBuff , _outBytesUsed , _securePasswords , _securePasswordOffsetsInBuffer ) ;
907
+ PacketHandle packet = GetResetWritePacket ( ) ;
908
+ SNIPacket nativePacket = packet . NativePacket ;
909
+ SniNativeWrapper . SniPacketSetData ( nativePacket , _outBuff , _outBytesUsed , _securePasswords , _securePasswordOffsetsInBuffer ) ;
876
910
877
911
Debug . Assert ( Parser . Connection . _parserLock . ThreadMayHaveLock ( ) , "Thread is writing without taking the connection lock" ) ;
878
912
Task task = SNIWritePacket ( packet , out _ , canAccumulate , callerHasConnectionLock : true ) ;
@@ -923,7 +957,7 @@ private Task WriteSni(bool canAccumulate)
923
957
return task ;
924
958
}
925
959
926
- internal SNIPacket GetResetWritePacket ( )
960
+ internal PacketHandle GetResetWritePacket ( )
927
961
{
928
962
if ( _sniPacket != null )
929
963
{
@@ -936,7 +970,7 @@ internal SNIPacket GetResetWritePacket()
936
970
_sniPacket = _writePacketCache . Take ( Handle ) ;
937
971
}
938
972
}
939
- return _sniPacket ;
973
+ return PacketHandle . FromNativePacket ( _sniPacket ) ;
940
974
}
941
975
942
976
internal void ClearAllWritePackets ( )
@@ -953,8 +987,10 @@ internal void ClearAllWritePackets()
953
987
}
954
988
}
955
989
956
- private IntPtr AddPacketToPendingList ( SNIPacket packet )
990
+ private PacketHandle AddPacketToPendingList ( PacketHandle packetToAdd )
957
991
{
992
+ Debug . Assert ( packetToAdd . Type == PacketHandle . NativePacketType , "unexpected packet type when requiring NativePacket" ) ;
993
+ SNIPacket packet = packetToAdd . NativePacket ;
958
994
Debug . Assert ( packet == _sniPacket , "Adding a packet other than the current packet to the pending list" ) ;
959
995
_sniPacket = null ;
960
996
IntPtr pointer = packet . DangerousGetHandle ( ) ;
@@ -964,16 +1000,17 @@ private IntPtr AddPacketToPendingList(SNIPacket packet)
964
1000
_pendingWritePackets . Add ( pointer , packet ) ;
965
1001
}
966
1002
967
- return pointer ;
1003
+ return PacketHandle . FromNativePointer ( pointer ) ;
968
1004
}
969
1005
970
- private void RemovePacketFromPendingList ( IntPtr pointer )
1006
+ private void RemovePacketFromPendingList ( PacketHandle ptr )
971
1007
{
972
- SNIPacket recoveredPacket ;
1008
+ Debug . Assert ( ptr . Type == PacketHandle . NativePointerType , "unexpected packet type when requiring NativePointer" ) ;
1009
+ IntPtr pointer = ptr . NativePointer ;
973
1010
974
1011
lock ( _writePacketLockObject )
975
1012
{
976
- if ( _pendingWritePackets . TryGetValue ( pointer , out recoveredPacket ) )
1013
+ if ( _pendingWritePackets . TryGetValue ( pointer , out SNIPacket recoveredPacket ) )
977
1014
{
978
1015
_pendingWritePackets . Remove ( pointer ) ;
979
1016
_writePacketCache . Add ( recoveredPacket ) ;
@@ -1033,6 +1070,6 @@ private void SniWriteStatisticsAndTracing()
1033
1070
SqlClientEventSource . Log . TryAdvancedTraceBinEvent ( "TdsParser.WritePacket | INFO | ADV | State Object Id {0}, Packet sent. Out buffer: {1}, Out Bytes Used: {2}" , ObjectID , _outBuff , _outBytesUsed ) ;
1034
1071
}
1035
1072
1036
- protected PacketHandle EmptyReadPacket => default ;
1073
+ protected PacketHandle EmptyReadPacket => PacketHandle . FromNativePointer ( default ) ;
1037
1074
}
1038
1075
}
0 commit comments