@@ -9,13 +9,11 @@ namespace MySqlConnector.Core
9
9
{
10
10
internal static class BackgroundConnectionResetHelper
11
11
{
12
- public static void AddSession ( ServerSession session )
12
+ public static void AddSession ( ServerSession session , MySqlConnection ? owningConnection )
13
13
{
14
- // TODO: save the MySqlConnection object so this session isn't considered leaked
15
-
16
14
var resetTask = session . TryResetConnectionAsync ( session . Pool ! . ConnectionSettings , IOBehavior . Asynchronous , default ) ;
17
15
lock ( s_lock )
18
- s_sessions . Add ( new SessionResetTask ( session , resetTask ) ) ;
16
+ s_sessions . Add ( new SessionResetTask ( session , resetTask , owningConnection ) ) ;
19
17
20
18
if ( Log . IsDebugEnabled ( ) )
21
19
Log . Debug ( "Started Session{0} reset in background; waiting SessionCount: {1}." , session . Id , s_sessions . Count ) ;
@@ -71,7 +69,7 @@ public static async Task ReturnSessionsAsync()
71
69
Log . Info ( "Started BackgroundConnectionResetHelper worker." ) ;
72
70
73
71
List < Task < bool > > localTasks = new ( ) ;
74
- List < ServerSession > localSessions = new ( ) ;
72
+ List < SessionResetTask > localSessions = new ( ) ;
75
73
76
74
// keep running until stopped
77
75
while ( ! s_cancellationTokenSource . IsCancellationRequested )
@@ -94,10 +92,10 @@ public static async Task ReturnSessionsAsync()
94
92
}
95
93
else
96
94
{
97
- foreach ( var data in s_sessions )
95
+ foreach ( var session in s_sessions )
98
96
{
99
- localSessions . Add ( data . Session ) ;
100
- localTasks . Add ( data . ResetTask ) ;
97
+ localSessions . Add ( session ) ;
98
+ localTasks . Add ( session . ResetTask ) ;
101
99
}
102
100
s_sessions . Clear ( ) ;
103
101
}
@@ -110,7 +108,7 @@ public static async Task ReturnSessionsAsync()
110
108
{
111
109
var completedTask = await Task . WhenAny ( localTasks ) . ConfigureAwait ( false ) ;
112
110
var index = localTasks . IndexOf ( completedTask ) ;
113
- var session = localSessions [ index ] ;
111
+ var session = localSessions [ index ] . Session ;
114
112
await session . Pool ! . ReturnAsync ( IOBehavior . Asynchronous , session ) . ConfigureAwait ( false ) ;
115
113
localSessions . RemoveAt ( index ) ;
116
114
localTasks . RemoveAt ( index ) ;
@@ -126,21 +124,23 @@ public static async Task ReturnSessionsAsync()
126
124
127
125
internal struct SessionResetTask
128
126
{
129
- public SessionResetTask ( ServerSession session , Task < bool > resetTask )
127
+ public SessionResetTask ( ServerSession session , Task < bool > resetTask , MySqlConnection ? owningConnection )
130
128
{
131
129
Session = session ;
132
130
ResetTask = resetTask ;
131
+ OwningConnection = owningConnection ;
133
132
}
134
133
135
134
public ServerSession Session { get ; }
136
135
public Task < bool > ResetTask { get ; }
136
+ public MySqlConnection ? OwningConnection { get ; }
137
137
}
138
138
139
139
static readonly IMySqlConnectorLogger Log = MySqlConnectorLogManager . CreateLogger ( nameof ( BackgroundConnectionResetHelper ) ) ;
140
140
static readonly object s_lock = new ( ) ;
141
141
static readonly SemaphoreSlim s_semaphore = new ( 1 , 1 ) ;
142
142
static readonly CancellationTokenSource s_cancellationTokenSource = new ( ) ;
143
- static List < SessionResetTask > s_sessions = new ( ) ;
143
+ static readonly List < SessionResetTask > s_sessions = new ( ) ;
144
144
static Task ? s_workerTask ;
145
145
}
146
146
}
0 commit comments