|  |  | 
|  |  | 
|  | event = WSACreateEvent(void); | 
|  | WSAEventSelect(s, event, FD_ACCEPT); | 
|  |  | 
|  |  | 
|  | int ngx_overlapped_process_events(ngx_log_t *log) | 
|  | { | 
|  | if (acceptex) | 
|  | n = SleepEx(timer, 1); | 
|  | else | 
|  | n = WSAWaitForMultipleEvents(nevents, events, 0, timer, 1); | 
|  |  | 
|  | if (n == WSA_WAIT_TIMEOUT) | 
|  | close some event; | 
|  |  | 
|  | if (n == WSA_IO_COMPLETION) | 
|  | again | 
|  |  | 
|  | /* try it with AcceptEx() on NT to detect connected sockets */ | 
|  | if (!acceptex) { | 
|  | WSAEnumNetworkEvents( | 
|  | sockets[n - WSA_WAIT_EVENT_0], | 
|  | events[n - WSA_WAIT_EVENT_0], | 
|  | net_events); | 
|  |  | 
|  | if (net_events.lNetworkEvents & FD_ACCEPT) { | 
|  | if (net_events.iErrorCode[FD_ACCEPT_BIT] != 0) | 
|  | accept error | 
|  | again | 
|  |  | 
|  | ngx_event_accept(); OR post AcceptEx(); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | void CALLBACK overlapped_completion_procedure(DWORD error, DWORD nbytes, | 
|  | LPWSAOVERLAPPED overlapped, DWORD flags) | 
|  | { | 
|  | run event handler | 
|  | } |