Skip to content

Commit b7ba388

Browse files
authored
Implement IStatefulPinnedMarshalling test marshallers (#90685)
* Implement test interfaces and marshallers and test them
1 parent 028ad32 commit b7ba388

File tree

5 files changed

+415
-37
lines changed

5 files changed

+415
-37
lines changed

src/libraries/System.Runtime.InteropServices/tests/ComInterfaceGenerator.Tests/RcwAroundCcwTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,33 @@ public void StatefulMarshalling()
200200
var obj = CreateWrapper<StatefulMarshalling, IStatefulMarshalling>();
201201
var data = new StatefulType() { i = 42 };
202202

203+
int preCallFreeCount = StatefulTypeMarshaller.FreeCount;
203204
obj.Method(data);
204205
Assert.Equal(42, data.i);
206+
Assert.Equal(preCallFreeCount + 2, StatefulTypeMarshaller.FreeCount);
207+
208+
preCallFreeCount = StatefulTypeMarshaller.FreeCount;
205209
obj.MethodIn(in data);
206210
Assert.Equal(42, data.i);
211+
Assert.Equal(preCallFreeCount + 2, StatefulTypeMarshaller.FreeCount);
212+
207213
var oldData = data;
214+
preCallFreeCount = StatefulTypeMarshaller.FreeCount;
208215
obj.MethodRef(ref data);
216+
Assert.Equal(preCallFreeCount + 2, StatefulTypeMarshaller.FreeCount);
209217
Assert.True(oldData == data); // We want reference equality here
218+
219+
preCallFreeCount = StatefulTypeMarshaller.FreeCount;
210220
obj.MethodOut(out data);
221+
Assert.Equal(preCallFreeCount + 2, StatefulTypeMarshaller.FreeCount);
211222
Assert.Equal(1, data.i);
223+
224+
preCallFreeCount = StatefulTypeMarshaller.FreeCount;
212225
Assert.Equal(1, obj.Return().i);
226+
Assert.Equal(preCallFreeCount + 2, StatefulTypeMarshaller.FreeCount);
227+
preCallFreeCount = StatefulTypeMarshaller.FreeCount;
213228
Assert.Equal(1, obj.ReturnPreserveSig().i);
229+
Assert.Equal(preCallFreeCount + 2, StatefulTypeMarshaller.FreeCount);
214230
}
215231

216232
[Fact]
@@ -219,16 +235,67 @@ public void StatelessCallerAllocatedBufferMarshalling()
219235
var obj = CreateWrapper<StatelessCallerAllocatedBufferMarshalling, IStatelessCallerAllocatedBufferMarshalling>();
220236
var data = new StatelessCallerAllocatedBufferType() { I = 42 };
221237

238+
// ManagedToUnmanagedIn should use Caller Allocated Buffer and not allocate
239+
StatelessCallerAllocatedBufferTypeMarshaller.DisableAllocations();
240+
241+
var numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller.FreeCount;
222242
obj.Method(data);
243+
Assert.Equal(1 + numFreeCalls, StatelessCallerAllocatedBufferTypeMarshaller.FreeCount);
223244
Assert.Equal(42, data.I);
245+
246+
numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller.FreeCount;
224247
obj.MethodIn(in data);
248+
Assert.Equal(1 + numFreeCalls, StatelessCallerAllocatedBufferTypeMarshaller.FreeCount);
225249
Assert.Equal(42, data.I);
250+
251+
// Other marshal modes will allocate
252+
StatelessCallerAllocatedBufferTypeMarshaller.EnableAllocations();
253+
254+
numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller.FreeCount;
226255
obj.MethodRef(ref data);
256+
Assert.Equal(2 + numFreeCalls, StatelessCallerAllocatedBufferTypeMarshaller.FreeCount);
257+
StatelessCallerAllocatedBufferTypeMarshaller.AssertAllPointersFreed();
227258
Assert.Equal(200, data.I);
259+
260+
numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller.FreeCount;
228261
obj.MethodOut(out data);
262+
Assert.Equal(1 + numFreeCalls, StatelessCallerAllocatedBufferTypeMarshaller.FreeCount);
263+
StatelessCallerAllocatedBufferTypeMarshaller.AssertAllPointersFreed();
229264
Assert.Equal(20, data.I);
265+
266+
numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller.FreeCount;
230267
Assert.Equal(201, obj.Return().I);
268+
Assert.Equal(1 + numFreeCalls, StatelessCallerAllocatedBufferTypeMarshaller.FreeCount);
269+
270+
numFreeCalls = StatelessCallerAllocatedBufferTypeMarshaller.FreeCount;
231271
Assert.Equal(202, obj.ReturnPreserveSig().I);
272+
Assert.Equal(1 + numFreeCalls, StatelessCallerAllocatedBufferTypeMarshaller.FreeCount);
273+
}
274+
275+
[Fact]
276+
public void StatefulPinnedMarshalling()
277+
{
278+
var obj = CreateWrapper<StatefulPinnedMarshalling, IStatefulPinnedMarshalling>();
279+
var data = new StatefulPinnedType() { I = 4 };
280+
281+
StatefulPinnedTypeMarshaller.ManagedToUnmanagedIn.DisableNonPinnedPath();
282+
283+
obj.Method(data);
284+
Assert.Equal(4, data.I);
285+
286+
obj.MethodIn(in data);
287+
Assert.Equal(4, data.I);
288+
289+
StatefulPinnedTypeMarshaller.ManagedToUnmanagedIn.EnableNonPinnedPath();
290+
291+
obj.MethodOut(out data);
292+
Assert.Equal(102, data.I);
293+
294+
obj.MethodRef(ref data);
295+
Assert.Equal(103, data.I);
296+
297+
data = obj.Return();
298+
Assert.Equal(104, data.I);
232299
}
233300

234301
[Fact]

src/libraries/System.Runtime.InteropServices/tests/ComInterfaceGenerator.Tests/UnmanagedToManagedCustomMarshallingTests.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System;
5-
using System.Collections.Generic;
65
using System.Linq;
76
using System.Runtime.CompilerServices;
87
using System.Runtime.InteropServices;
98
using System.Runtime.InteropServices.Marshalling;
10-
using System.Text;
119
using System.Threading;
12-
using System.Threading.Tasks;
1310
using SharedTypes;
1411
using Xunit;
1512
using static ComInterfaceGenerator.Tests.UnmanagedToManagedCustomMarshallingTests;

src/libraries/System.Runtime.InteropServices/tests/TestAssets/SharedTypes/ComInterfaces/IStatefulMarshalling.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ internal struct StatefulNative
5050
[CustomMarshaller(typeof(StatefulType), MarshalMode.ManagedToUnmanagedRef, typeof(Bidirectional))]
5151
internal struct StatefulTypeMarshaller
5252
{
53+
public static int FreeCount => Bidirectional.FreeCount + ManagedToUnmanaged.FreeCount + UnmanagedToManaged.FreeCount;
5354
internal struct Bidirectional
5455
{
5556
public static int FreeCount { get; private set; }

0 commit comments

Comments
 (0)