@@ -29,6 +29,8 @@ SERVER_PROCESS::Initialize(
29
29
m_dwShutdownTimeLimitInMS = dwShtudownTimeLimitInMS;
30
30
m_fStdoutLogEnabled = fStdoutLogEnabled ;
31
31
32
+ m_pProcessManager->ReferenceProcessManager ();
33
+
32
34
hr = m_ProcessPath.Copy (*pszProcessExePath);
33
35
if (FAILED (hr))
34
36
{
@@ -1208,7 +1210,7 @@ SERVER_PROCESS::CheckIfServerIsUp(
1208
1210
return hr;
1209
1211
}
1210
1212
1211
- // send ctrl-c signnal to the process to let it graceful shutdown
1213
+ // send ctrl-c signnal to the process to let it gracefully shutdown
1212
1214
// if the process cannot shutdown within given time, terminate it
1213
1215
// todo: allow user to config this shutdown timeout
1214
1216
@@ -1217,62 +1219,69 @@ SERVER_PROCESS::SendSignal(
1217
1219
VOID
1218
1220
)
1219
1221
{
1220
- HANDLE hProc;
1222
+ HANDLE hProc = INVALID_HANDLE_VALUE ;
1221
1223
BOOL fIsSuccess = FALSE ;
1222
1224
LPCWSTR apsz[1 ];
1223
1225
STACK_STRU (strEventMsg, 256 );
1224
1226
1225
1227
hProc = OpenProcess (SYNCHRONIZE | PROCESS_TERMINATE, FALSE , m_dwProcessId);
1226
1228
if (hProc != INVALID_HANDLE_VALUE)
1227
1229
{
1228
- fIsSuccess = GenerateConsoleCtrlEvent (CTRL_C_EVENT, m_dwProcessId);
1230
+ fIsSuccess = GenerateConsoleCtrlEvent (CTRL_C_EVENT, m_dwProcessId);
1229
1231
1230
1232
if (!fIsSuccess )
1231
1233
{
1232
1234
if (AttachConsole (m_dwProcessId))
1233
1235
{
1234
- fIsSuccess = GenerateConsoleCtrlEvent (CTRL_C_EVENT, m_dwProcessId);
1236
+ fIsSuccess = GenerateConsoleCtrlEvent (CTRL_C_EVENT, m_dwProcessId);
1235
1237
FreeConsole ();
1236
- CloseHandle (m_hProcessHandle);
1237
- m_hProcessHandle = INVALID_HANDLE_VALUE;
1238
- }
1239
-
1240
- if (!fIsSuccess )
1241
- {
1242
- if (SUCCEEDED (strEventMsg.SafeSnwprintf (
1243
- ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE_MSG,
1244
- m_dwProcessId )))
1245
- {
1246
- apsz[0 ] = strEventMsg.QueryStr ();
1247
- // log a warning for ungraceful shutdown
1248
- if (FORWARDING_HANDLER::QueryEventLog () != NULL )
1249
- {
1250
- ReportEventW (FORWARDING_HANDLER::QueryEventLog (),
1251
- EVENTLOG_INFORMATION_TYPE,
1252
- 0 ,
1253
- ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE,
1254
- NULL ,
1255
- 1 ,
1256
- 0 ,
1257
- apsz,
1258
- NULL );
1259
- }
1260
- }
1261
1238
}
1239
+ }
1240
+ }
1241
+
1242
+ if (!fIsSuccess || (WaitForSingleObject (hProc, m_dwShutdownTimeLimitInMS) != WAIT_OBJECT_0))
1243
+ {
1244
+ // Backend process will be terminated, remove the waitcallback
1245
+ if (m_hProcessWaitHandle != NULL )
1246
+ {
1247
+ UnregisterWait (m_hProcessWaitHandle);
1248
+ m_hProcessWaitHandle = NULL ;
1262
1249
}
1263
1250
1264
- if (!fIsSuccess || (WaitForSingleObject (hProc, m_dwShutdownTimeLimitInMS) != WAIT_OBJECT_0))
1251
+ // cannot gracefully shutdown or timeout, terminate the process
1252
+ TerminateProcess (m_hProcessHandle, 0 );
1253
+
1254
+ // log a warning for ungraceful shutdown
1255
+ if (SUCCEEDED (strEventMsg.SafeSnwprintf (
1256
+ ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE_MSG,
1257
+ m_dwProcessId)))
1265
1258
{
1266
- // cannot gracefule shutdown or timeout
1267
- // terminate the process
1268
- TerminateProcess (m_hProcessHandle, 0 );
1259
+ apsz[0 ] = strEventMsg.QueryStr ();
1260
+ if (FORWARDING_HANDLER::QueryEventLog () != NULL )
1261
+ {
1262
+ ReportEventW (FORWARDING_HANDLER::QueryEventLog (),
1263
+ EVENTLOG_WARNING_TYPE,
1264
+ 0 ,
1265
+ ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE,
1266
+ NULL ,
1267
+ 1 ,
1268
+ 0 ,
1269
+ apsz,
1270
+ NULL );
1271
+ }
1269
1272
}
1270
1273
}
1274
+
1271
1275
if (hProc != INVALID_HANDLE_VALUE)
1272
1276
{
1273
1277
CloseHandle (hProc);
1274
1278
hProc = INVALID_HANDLE_VALUE;
1275
1279
}
1280
+ if (m_hProcessHandle != INVALID_HANDLE_VALUE)
1281
+ {
1282
+ CloseHandle (m_hProcessHandle);
1283
+ m_hProcessHandle = INVALID_HANDLE_VALUE;
1284
+ }
1276
1285
}
1277
1286
1278
1287
//
@@ -1640,7 +1649,6 @@ SERVER_PROCESS::StopAllProcessesInJobObject(
1640
1649
1641
1650
SERVER_PROCESS::SERVER_PROCESS () :
1642
1651
m_cRefs( 1 ),
1643
- m_CancelEvent( NULL ),
1644
1652
m_hProcessHandle( NULL ),
1645
1653
m_hProcessWaitHandle( NULL ),
1646
1654
m_dwProcessId( 0 ),
@@ -1681,13 +1689,6 @@ SERVER_PROCESS::~SERVER_PROCESS()
1681
1689
m_hProcessWaitHandle = NULL ;
1682
1690
}
1683
1691
1684
- if ( m_CancelEvent != NULL )
1685
- {
1686
- SetEvent ( m_CancelEvent );
1687
- CloseHandle ( m_CancelEvent );
1688
- m_CancelEvent = NULL ;
1689
- }
1690
-
1691
1692
for (INT i=0 ;i<MAX_ACTIVE_CHILD_PROCESSES;++i)
1692
1693
{
1693
1694
if (m_hChildProcessWaitHandles[i] != NULL )
0 commit comments