3
3
4
4
using System ;
5
5
using System . Linq ;
6
+ using System . Runtime . InteropServices ;
6
7
using Microsoft . AspNet . Server . Kestrel . Infrastructure ;
7
8
using Xunit ;
8
9
@@ -15,90 +16,113 @@ private void FullByteRangeSupported()
15
16
{
16
17
var byteRange = Enumerable . Range ( 0 , 256 ) . Select ( x => ( byte ) x ) . ToArray ( ) ;
17
18
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 ;
20
24
21
- var begin = mem . GetIterator ( ) ;
22
- var end = GetIterator ( begin , byteRange . Length ) ;
25
+ var begin = mem . GetIterator ( ) ;
26
+ var end = GetIterator ( begin , byteRange . Length ) ;
23
27
24
- var s = begin . GetAsciiString ( end ) ;
28
+ var s = begin . GetAsciiString ( end ) ;
25
29
26
- Assert . Equal ( s . Length , byteRange . Length ) ;
30
+ Assert . Equal ( s . Length , byteRange . Length ) ;
27
31
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 ] ;
32
36
33
- Assert . Equal ( sb , b ) ;
37
+ Assert . Equal ( sb , b ) ;
38
+ }
39
+ }
40
+ finally
41
+ {
42
+ handle . Free ( ) ;
34
43
}
35
44
}
36
45
37
46
[ Fact ]
38
47
private void MultiBlockProducesCorrectResults ( )
39
48
{
40
49
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
68
52
{
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 ) , IntPtr . Zero , null , null ) ;
60
+ var mem1 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
61
+ var mem2 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
62
+ var mem3 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , 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 ( ) ;
73
90
}
74
91
}
75
92
76
93
[ Fact ]
77
94
private void LargeAllocationProducesCorrectResults ( )
78
95
{
79
96
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 ( ) ;
81
100
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 ) , IntPtr . Zero , null , null ) ;
102
+ var mem1 = MemoryPoolBlock2 . Create ( new ArraySegment < byte > ( byteRange ) , IntPtr . Zero , null , null ) ;
103
+ mem0 . End = byteRange . Length ;
104
+ mem1 . End = byteRange . Length ;
86
105
87
- mem0 . Next = mem1 ;
106
+ mem0 . Next = mem1 ;
88
107
89
- var begin = mem0 . GetIterator ( ) ;
90
- var end = GetIterator ( begin , expectedByteRange . Length ) ;
108
+ var begin = mem0 . GetIterator ( ) ;
109
+ var end = GetIterator ( begin , expectedByteRange . Length ) ;
91
110
92
- var s = begin . GetAsciiString ( end ) ;
111
+ var s = begin . GetAsciiString ( end ) ;
93
112
94
- Assert . Equal ( s . Length , expectedByteRange . Length ) ;
113
+ Assert . Equal ( s . Length , expectedByteRange . Length ) ;
95
114
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 ] ;
100
119
101
- Assert . Equal ( sb , b ) ;
120
+ Assert . Equal ( sb , b ) ;
121
+ }
122
+ }
123
+ finally
124
+ {
125
+ handle . Free ( ) ;
102
126
}
103
127
}
104
128
0 commit comments