MCPcopy Create free account
hub / github.com/caozhiyi/CppNet / ProcessEvent

Method ProcessEvent

net/win/IOCP.cpp:118–198  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

116}
117
118void 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()) {

Callers

nothing calls this directly

Calls 1

TimeoutCheckMethod · 0.80

Tested by

no test coverage detected