-
Notifications
You must be signed in to change notification settings - Fork 778
Expand file tree
/
Copy pathEvents.cs
More file actions
61 lines (48 loc) · 1.18 KB
/
Events.cs
File metadata and controls
61 lines (48 loc) · 1.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Diagnostics;
using System.Threading;
using NUnit.Framework;
using Python.Runtime;
namespace Python.EmbeddingTest;
public class Events
{
[Test]
public void UsingDoesNotLeak()
{
using var scope = Py.CreateScope();
scope.Exec(@"
import gc
from Python.EmbeddingTest import ClassWithEventHandler
def event_handler():
pass
for _ in range(2000):
example = ClassWithEventHandler()
example.LeakEvent += event_handler
example.LeakEvent -= event_handler
del example
gc.collect()
");
Runtime.Runtime.TryCollectingGarbage(10);
Assert.That(ClassWithEventHandler.alive, Is.EqualTo(0));
}
}
public class ClassWithEventHandler
{
internal static int alive;
public event EventHandler LeakEvent;
private Array arr; // dummy array to exacerbate memory leak
public ClassWithEventHandler()
{
Interlocked.Increment(ref alive);
this.arr = new int[800];
}
// Reference LeakEvent to silence warning
protected virtual void OnLeakEvent(EventArgs e)
{
LeakEvent?.Invoke(this, e);
}
~ClassWithEventHandler()
{
Interlocked.Decrement(ref alive);
}
}