@@ -50,6 +50,7 @@ LONGLONG s_llStartTime = 0;
50
50
LONGLONG s_llLastTime = 0 ;
51
51
52
52
BOOL LogMessageV (BYTE nSeverity, PCHAR pszMsg, ...);
53
+ VOID AcceptAndCreatePipeConnection (PCLIENT pClient, HANDLE hCompletionPort);
53
54
54
55
// ////////////////////////////////////////////////////////////////////////////
55
56
//
@@ -181,8 +182,14 @@ PCLIENT CreatePipeConnection(HANDLE hCompletionPort)
181
182
}
182
183
183
184
if (!ConnectNamedPipe (hPipe, pClient)) {
184
- if (GetLastError () != ERROR_IO_PENDING &&
185
- GetLastError () != ERROR_PIPE_LISTENING) {
185
+ DWORD dwLastErr = GetLastError ();
186
+ // Handle race between multiple client connections
187
+ // example: multi thread or client request at alomst same time.
188
+ if (ERROR_PIPE_CONNECTED == dwLastErr)
189
+ {
190
+ AcceptAndCreatePipeConnection (pClient, hCompletionPort);
191
+ } else if ( dwLastErr != ERROR_IO_PENDING &&
192
+ dwLastErr != ERROR_PIPE_LISTENING) {
186
193
MyErrExit (" ConnectNamedPipe" );
187
194
}
188
195
}
@@ -193,6 +200,25 @@ PCLIENT CreatePipeConnection(HANDLE hCompletionPort)
193
200
return pClient;
194
201
}
195
202
203
+ VOID AcceptAndCreatePipeConnection (PCLIENT pClient, HANDLE hCompletionPort) {
204
+ DWORD nBytes = 0 ;
205
+ InterlockedIncrement (&s_nActiveClients);
206
+ pClient->fAwaitingAccept = FALSE ;
207
+ BOOL b = ReadFile (pClient->hPipe ,
208
+ &pClient->Message ,
209
+ sizeof (pClient->Message ),
210
+ &nBytes,
211
+ pClient);
212
+ if (!b) {
213
+ if (GetLastError () != ERROR_IO_PENDING) {
214
+ LogMessageV (SYELOG_SEVERITY_ERROR,
215
+ " ReadFile failed %d." , GetLastError ());
216
+ }
217
+ }
218
+
219
+ CreatePipeConnection (hCompletionPort);
220
+ }
221
+
196
222
BOOL LogMessageV (BYTE nSeverity, PCHAR pszMsg, ...)
197
223
{
198
224
FILETIME ftOccurance;
@@ -352,22 +378,7 @@ DWORD WINAPI WorkerThread(LPVOID pvVoid)
352
378
}
353
379
354
380
if (pClient->fAwaitingAccept ) {
355
- InterlockedIncrement (&s_nActiveClients);
356
- pClient->fAwaitingAccept = FALSE ;
357
- b = ReadFile (pClient->hPipe ,
358
- &pClient->Message ,
359
- sizeof (pClient->Message ),
360
- &nBytes,
361
- pClient);
362
- if (!b) {
363
- if (GetLastError () != ERROR_IO_PENDING) {
364
- LogMessageV (SYELOG_SEVERITY_ERROR,
365
- " ReadFile failed %d." , GetLastError ());
366
- continue ;
367
- }
368
- }
369
-
370
- CreatePipeConnection (hCompletionPort);
381
+ AcceptAndCreatePipeConnection (pClient, hCompletionPort);
371
382
}
372
383
else {
373
384
if (nBytes < offsetof (SYELOG_MESSAGE, szMessage)) {
0 commit comments