| 116 | } |
| 117 | |
| 118 | void CIOCP::ProcessEvent() { |
| 119 | DWORD bytes_transfered = 0; |
| 120 | EventOverlapped *socket_context = nullptr; |
| 121 | OVERLAPPED *over_lapped = nullptr; |
| 122 | unsigned int wait_time = 0; |
| 123 | std::vector<base::CMemSharePtr<CTimerEvent>> timer_vec; |
| 124 | while (_run) { |
| 125 | wait_time = _timer.TimeoutCheck(timer_vec); |
| 126 | //if there is no timer event. wait until recv something |
| 127 | if (wait_time == 0 && timer_vec.empty()) { |
| 128 | wait_time = INFINITE; |
| 129 | |
| 130 | } else { |
| 131 | wait_time = wait_time > 0 ? wait_time : 1; |
| 132 | } |
| 133 | |
| 134 | int res = GetQueuedCompletionStatus(_iocp_handler, &bytes_transfered, PULONG_PTR(&socket_context), |
| 135 | &over_lapped, wait_time); |
| 136 | |
| 137 | DWORD dw_err = 0; |
| 138 | if (res) { |
| 139 | dw_err = GetLastError(); |
| 140 | // exit |
| 141 | if ((PULONG_PTR)socket_context == (PULONG_PTR)EXIT_IOCP){ |
| 142 | break; |
| 143 | } |
| 144 | |
| 145 | } else { |
| 146 | dw_err = GetLastError(); |
| 147 | } |
| 148 | |
| 149 | // timer out event |
| 150 | if (dw_err == WAIT_TIMEOUT) { |
| 151 | if (!timer_vec.empty()) { |
| 152 | _DoTimeoutEvent(timer_vec); |
| 153 | } |
| 154 | _DoTaskList(); |
| 155 | |
| 156 | // read some thing |
| 157 | } else if (ERROR_NETNAME_DELETED == dw_err || NO_ERROR == dw_err || ERROR_IO_PENDING == dw_err) { |
| 158 | if (over_lapped) { |
| 159 | socket_context = CONTAINING_RECORD(over_lapped, EventOverlapped, _overlapped); |
| 160 | base::LOG_DEBUG("Get a new event : %d", socket_context->_event_flag_set); |
| 161 | _DoEvent(socket_context, bytes_transfered); |
| 162 | } |
| 163 | if (!timer_vec.empty()) { |
| 164 | _DoTimeoutEvent(timer_vec); |
| 165 | } |
| 166 | _DoTaskList(); |
| 167 | |
| 168 | } else if (ERROR_CONNECTION_REFUSED == dw_err || ERROR_SEM_TIMEOUT == dw_err || WSAENOTCONN == dw_err || ERROR_OPERATION_ABORTED == dw_err) { |
| 169 | if (over_lapped) { |
| 170 | socket_context = CONTAINING_RECORD(over_lapped, EventOverlapped, _overlapped); |
| 171 | base::LOG_DEBUG("Get a new event : %d", socket_context->_event_flag_set); |
| 172 | socket_context->_event_flag_set |= ERR_CONNECT_CLOSE; |
| 173 | _DoEvent(socket_context, bytes_transfered); |
| 174 | } |
| 175 | if (!timer_vec.empty()) { |
nothing calls this directly
no test coverage detected