8
8
#include " file_utility.h"
9
9
#include " exceptions.h"
10
10
11
- #define STARTUP_TIME_LIMIT_INCREMENT_IN_MILLISECONDS 5000
12
-
13
11
HRESULT
14
12
SERVER_PROCESS::Initialize (
15
13
PROCESS_MANAGER *pProcessManager,
16
14
STRU *pszProcessExePath,
17
15
STRU *pszArguments,
18
16
DWORD dwStartupTimeLimitInMS,
19
- DWORD dwShtudownTimeLimitInMS ,
17
+ DWORD dwShutdownTimeLimitInMS ,
20
18
BOOL fWindowsAuthEnabled ,
21
19
BOOL fBasicAuthEnabled ,
22
20
BOOL fAnonymousAuthEnabled ,
@@ -31,11 +29,9 @@ SERVER_PROCESS::Initialize(
31
29
STRU *pszHttpsPort
32
30
)
33
31
{
34
- HRESULT hr = S_OK;
35
-
36
32
m_pProcessManager = pProcessManager;
37
33
m_dwStartupTimeLimitInMS = dwStartupTimeLimitInMS;
38
- m_dwShutdownTimeLimitInMS = dwShtudownTimeLimitInMS ;
34
+ m_dwShutdownTimeLimitInMS = dwShutdownTimeLimitInMS ;
39
35
m_fStdoutLogEnabled = fStdoutLogEnabled ;
40
36
m_fWebSocketSupported = fWebSocketSupported ;
41
37
m_fWindowsAuthEnabled = fWindowsAuthEnabled ;
@@ -45,6 +41,7 @@ SERVER_PROCESS::Initialize(
45
41
m_pProcessManager->ReferenceProcessManager ();
46
42
m_fDebuggerAttached = FALSE ;
47
43
44
+ HRESULT hr;
48
45
if (FAILED_LOG (hr = m_ProcessPath.Copy (*pszProcessExePath)) ||
49
46
FAILED_LOG (hr = m_struLogFile.Copy (*pstruStdoutLogFile))||
50
47
FAILED_LOG (hr = m_struPhysicalPath.Copy (*pszAppPhysicalPath))||
@@ -54,49 +51,44 @@ SERVER_PROCESS::Initialize(
54
51
FAILED_LOG (hr = m_struHttpsPort.Copy (*pszHttpsPort)) ||
55
52
FAILED_LOG (hr = SetupJobObject ()))
56
53
{
57
- goto Finished ;
54
+ return hr ;
58
55
}
59
56
60
57
m_pEnvironmentVarTable = pEnvironmentVariables;
61
58
62
- Finished:
63
- return hr;
59
+ return S_OK;
64
60
}
65
61
66
62
HRESULT
67
63
SERVER_PROCESS::SetupJobObject (VOID)
68
64
{
69
- HRESULT hr = S_OK;
70
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = { 0 };
65
+ if (m_hJobObject != nullptr )
66
+ {
67
+ return S_OK;
68
+ }
69
+
70
+ m_hJobObject = CreateJobObject (nullptr /* lpJobAttributes */ , nullptr /* lpName */ );
71
71
72
- if (m_hJobObject == NULL )
72
+ // 0xdeadbeef is used by Antares
73
+ constexpr size_t magicAntaresNumber = 0xdeadbeef ;
74
+ if (m_hJobObject == nullptr || m_hJobObject == reinterpret_cast <HANDLE>(magicAntaresNumber))
73
75
{
74
- m_hJobObject = CreateJobObject (NULL , // LPSECURITY_ATTRIBUTES
75
- NULL ); // LPCTSTR lpName
76
- #pragma warning( disable : 4312)
77
- // 0xdeadbeef is used by Antares
78
- if (m_hJobObject == NULL || m_hJobObject == (HANDLE)0xdeadbeef )
79
- {
80
- m_hJobObject = NULL ;
81
- // ignore job object creation error.
82
- }
83
- #pragma warning( error : 4312)
84
- if (m_hJobObject != NULL )
85
- {
86
- jobInfo.BasicLimitInformation .LimitFlags =
87
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
76
+ m_hJobObject = nullptr ;
88
77
89
- if (!SetInformationJobObject (m_hJobObject,
90
- JobObjectExtendedLimitInformation,
91
- &jobInfo,
92
- sizeof jobInfo))
93
- {
94
- hr = HRESULT_FROM_WIN32 (GetLastError ());
95
- }
96
- }
78
+ // ignore job object creation error.
79
+ return S_OK;
97
80
}
98
81
99
- return hr;
82
+ // Created a job object successfully. Set the job object limit.
83
+ JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = { 0 };
84
+ jobInfo.BasicLimitInformation .LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
85
+
86
+ if (!SetInformationJobObject (m_hJobObject, JobObjectExtendedLimitInformation, &jobInfo, sizeof jobInfo))
87
+ {
88
+ return HRESULT_FROM_WIN32 (GetLastError ());
89
+ }
90
+
91
+ return S_OK;
100
92
}
101
93
102
94
HRESULT
@@ -106,29 +98,34 @@ SERVER_PROCESS::GetRandomPort
106
98
DWORD dwExcludedPort = 0
107
99
)
108
100
{
109
- HRESULT hr = S_OK;
110
- BOOL fPortInUse = FALSE ;
111
- DWORD dwActualProcessId = 0 ;
101
+ DBG_ASSERT (pdwPickedPort);
112
102
113
103
std::uniform_int_distribution<> dist (MIN_PORT_RANDOM, MAX_PORT);
114
- DWORD cRetry = 0 ;
115
- do
116
- {
117
- //
118
- // ignore dwActualProcessId because here we are
119
- // determing whether the randomly generated port is
120
- // in use by any other process.
121
- //
122
- while ((*pdwPickedPort = dist (m_randomGenerator)) == dwExcludedPort);
123
- hr = CheckIfServerIsUp (*pdwPickedPort, &dwActualProcessId, &fPortInUse );
124
- } while (fPortInUse && ++cRetry < MAX_RETRY);
125
104
126
- if (cRetry >= MAX_RETRY)
105
+ BOOL fPortInUse ;
106
+ DWORD dwActualProcessId; // Ignored, but required for the function call.
107
+ constexpr int maxRetries = 10 ;
108
+ for (int retry = 0 ; retry < maxRetries; ++retry)
127
109
{
128
- hr = HRESULT_FROM_WIN32 (ERROR_PORT_NOT_SET);
110
+ do
111
+ {
112
+ *pdwPickedPort = dist (m_randomGenerator);
113
+ } while (*pdwPickedPort == dwExcludedPort); // Keep generating until a valid port is found.
114
+
115
+ HRESULT hr = CheckIfServerIsUp (*pdwPickedPort, &dwActualProcessId, &fPortInUse );
116
+ if (FAILED (hr))
117
+ {
118
+ return hr;
119
+ }
120
+
121
+ if (!fPortInUse )
122
+ {
123
+ return S_OK; // Port found and is not in use, success!
124
+ }
129
125
}
130
126
131
- return hr;
127
+ // All retries failed, return error.
128
+ return HRESULT_FROM_WIN32 (ERROR_PORT_NOT_SET);
132
129
}
133
130
134
131
HRESULT
@@ -219,40 +216,32 @@ SERVER_PROCESS::SetupListenPort(
219
216
220
217
HRESULT
221
218
SERVER_PROCESS::SetupAppPath (
222
- ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
219
+ ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
223
220
)
224
221
{
225
- HRESULT hr = S_OK;
226
- ENVIRONMENT_VAR_ENTRY* pEntry = NULL ;
227
-
222
+ ENVIRONMENT_VAR_ENTRY* pEntry = nullptr ;
228
223
pEnvironmentVarTable->FindKey (ASPNETCORE_APP_PATH_ENV_STR, &pEntry);
229
- if (pEntry != NULL )
224
+ if (pEntry != nullptr )
230
225
{
231
226
// user should not set this environment variable in configuration
232
227
pEnvironmentVarTable->DeleteKey (ASPNETCORE_APP_PATH_ENV_STR);
233
228
pEntry->Dereference ();
234
- pEntry = NULL ;
229
+ pEntry = nullptr ;
235
230
}
236
231
237
232
pEntry = new ENVIRONMENT_VAR_ENTRY ();
238
- if (pEntry == NULL )
233
+ if (pEntry == nullptr )
239
234
{
240
- hr = E_OUTOFMEMORY;
241
- goto Finished;
235
+ return E_OUTOFMEMORY;
242
236
}
243
237
244
- if ( FAILED_LOG ( hr = pEntry-> Initialize (ASPNETCORE_APP_PATH_ENV_STR, m_struAppVirtualPath. QueryStr ())) ||
245
- FAILED_LOG ( hr = pEnvironmentVarTable-> InsertRecord (pEntry )))
238
+ HRESULT hr = S_OK;
239
+ if ( SUCCEEDED_LOG ( hr = pEntry-> Initialize (ASPNETCORE_APP_PATH_ENV_STR, m_struAppVirtualPath. QueryStr () )))
246
240
{
247
- goto Finished ;
241
+ LOG_IF_FAILED (hr = pEnvironmentVarTable-> InsertRecord (pEntry)) ;
248
242
}
249
243
250
- Finished:
251
- if (pEntry != NULL )
252
- {
253
- pEntry->Dereference ();
254
- pEntry = NULL ;
255
- }
244
+ pEntry->Dereference ();
256
245
return hr;
257
246
}
258
247
0 commit comments