33
44using System ;
55using System . Linq ;
6+ using System . Runtime . InteropServices ;
67using Microsoft . AspNet . Server . Kestrel . Infrastructure ;
78using Xunit ;
89
@@ -15,90 +16,113 @@ private void FullByteRangeSupported()
1516 {
1617 var byteRange = Enumerable . Range ( 0 , 256 ) . Select ( x => ( byte ) x ) . ToArray ( ) ;
1718
18- var mem = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
19- mem . End = byteRange . Length ;
19+ var handle = GCHandle . Alloc ( byteRange , GCHandleType . Pinned ) ;
20+ try
21+ {
22+ var mem = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
23+ mem . End = byteRange . Length ;
2024
21- var begin = mem . GetIterator ( ) ;
22- var end = GetIterator ( begin , byteRange . Length ) ;
25+ var begin = mem . GetIterator ( ) ;
26+ var end = GetIterator ( begin , byteRange . Length ) ;
2327
24- var s = begin . GetAsciiString ( end ) ;
28+ var s = begin . GetAsciiString ( end ) ;
2529
26- Assert . Equal ( s . Length , byteRange . Length ) ;
30+ Assert . Equal ( s . Length , byteRange . Length ) ;
2731
28- for ( var i = 0 ; i < byteRange . Length ; i ++ )
29- {
30- var sb = ( byte ) s [ i ] ;
31- var b = byteRange [ i ] ;
32+ for ( var i = 0 ; i < byteRange . Length ; i ++ )
33+ {
34+ var sb = ( byte ) s [ i ] ;
35+ var b = byteRange [ i ] ;
3236
33- Assert . Equal ( sb , b ) ;
37+ Assert . Equal ( sb , b ) ;
38+ }
39+ }
40+ finally
41+ {
42+ handle . Free ( ) ;
3443 }
3544 }
3645
3746 [ Fact ]
3847 private void MultiBlockProducesCorrectResults ( )
3948 {
4049 var byteRange = Enumerable . Range ( 0 , 512 + 64 ) . Select ( x => ( byte ) x ) . ToArray ( ) ;
41- var expectedByteRange = byteRange
42- . Concat ( byteRange )
43- . Concat ( byteRange )
44- . Concat ( byteRange )
45- . ToArray ( ) ;
46-
47- var mem0 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
48- var mem1 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
49- var mem2 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
50- var mem3 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
51- mem0 . End = byteRange . Length ;
52- mem1 . End = byteRange . Length ;
53- mem2 . End = byteRange . Length ;
54- mem3 . End = byteRange . Length ;
55-
56- mem0 . Next = mem1 ;
57- mem1 . Next = mem2 ;
58- mem2 . Next = mem3 ;
59-
60- var begin = mem0 . GetIterator ( ) ;
61- var end = GetIterator ( begin , expectedByteRange . Length ) ;
62-
63- var s = begin . GetAsciiString ( end ) ;
64-
65- Assert . Equal ( s . Length , expectedByteRange . Length ) ;
66-
67- for ( var i = 0 ; i < expectedByteRange . Length ; i ++ )
50+ var handle = GCHandle . Alloc ( byteRange , GCHandleType . Pinned ) ;
51+ try
6852 {
69- var sb = ( byte ) s [ i ] ;
70- var b = expectedByteRange [ i ] ;
71-
72- Assert . Equal ( sb , b ) ;
53+ var expectedByteRange = byteRange
54+ . Concat ( byteRange )
55+ . Concat ( byteRange )
56+ . Concat ( byteRange )
57+ . ToArray ( ) ;
58+
59+ var mem0 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
60+ var mem1 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
61+ var mem2 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
62+ var mem3 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
63+ mem0 . End = byteRange . Length ;
64+ mem1 . End = byteRange . Length ;
65+ mem2 . End = byteRange . Length ;
66+ mem3 . End = byteRange . Length ;
67+
68+ mem0 . Next = mem1 ;
69+ mem1 . Next = mem2 ;
70+ mem2 . Next = mem3 ;
71+
72+ var begin = mem0 . GetIterator ( ) ;
73+ var end = GetIterator ( begin , expectedByteRange . Length ) ;
74+
75+ var s = begin . GetAsciiString ( end ) ;
76+
77+ Assert . Equal ( s . Length , expectedByteRange . Length ) ;
78+
79+ for ( var i = 0 ; i < expectedByteRange . Length ; i ++ )
80+ {
81+ var sb = ( byte ) s [ i ] ;
82+ var b = expectedByteRange [ i ] ;
83+
84+ Assert . Equal ( sb , b ) ;
85+ }
86+ }
87+ finally
88+ {
89+ handle . Free ( ) ;
7390 }
7491 }
7592
7693 [ Fact ]
7794 private void LargeAllocationProducesCorrectResults ( )
7895 {
7996 var byteRange = Enumerable . Range ( 0 , 16384 + 64 ) . Select ( x => ( byte ) x ) . ToArray ( ) ;
80- var expectedByteRange = byteRange . Concat ( byteRange ) . ToArray ( ) ;
97+ var handle = GCHandle . Alloc ( byteRange , GCHandleType . Pinned ) ;
98+ try {
99+ var expectedByteRange = byteRange . Concat ( byteRange ) . ToArray ( ) ;
81100
82- var mem0 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
83- var mem1 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
84- mem0 . End = byteRange . Length ;
85- mem1 . End = byteRange . Length ;
101+ var mem0 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
102+ var mem1 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , handle . AddrOfPinnedObject ( ) , null , null ) ;
103+ mem0 . End = byteRange . Length ;
104+ mem1 . End = byteRange . Length ;
86105
87- mem0 . Next = mem1 ;
106+ mem0 . Next = mem1 ;
88107
89- var begin = mem0 . GetIterator ( ) ;
90- var end = GetIterator ( begin , expectedByteRange . Length ) ;
108+ var begin = mem0 . GetIterator ( ) ;
109+ var end = GetIterator ( begin , expectedByteRange . Length ) ;
91110
92- var s = begin . GetAsciiString ( end ) ;
111+ var s = begin . GetAsciiString ( end ) ;
93112
94- Assert . Equal ( s . Length , expectedByteRange . Length ) ;
113+ Assert . Equal ( s . Length , expectedByteRange . Length ) ;
95114
96- for ( var i = 0 ; i < expectedByteRange . Length ; i ++ )
97- {
98- var sb = ( byte ) s [ i ] ;
99- var b = expectedByteRange [ i ] ;
115+ for ( var i = 0 ; i < expectedByteRange . Length ; i ++ )
116+ {
117+ var sb = ( byte ) s [ i ] ;
118+ var b = expectedByteRange [ i ] ;
100119
101- Assert . Equal ( sb , b ) ;
120+ Assert . Equal ( sb , b ) ;
121+ }
122+ }
123+ finally
124+ {
125+ handle . Free ( ) ;
102126 }
103127 }
104128
0 commit comments