fix enb crash during close down of enb and epc

master
Francisco 4 years ago committed by Francisco Paisana
parent cd8ee37f74
commit 93b1450e03

@ -147,7 +147,8 @@ private:
cmd_id_t cmd = cmd_id_t::EXIT; cmd_id_t cmd = cmd_id_t::EXIT;
int new_fd = -1; int new_fd = -1;
}; };
bool remove_socket_unprotected(int fd, fd_set* total_fd_set, int* max_fd); std::map<int, rx_multisocket_handler::task_callback_t>::iterator
remove_socket_unprotected(int fd, fd_set* total_fd_set, int* max_fd);
// args // args
std::string name; std::string name;

@ -594,18 +594,20 @@ bool rx_multisocket_handler::remove_socket(int fd)
return true; return true;
} }
bool rx_multisocket_handler::remove_socket_unprotected(int fd, fd_set* total_fd_set, int* max_fd) std::map<int, rx_multisocket_handler::task_callback_t>::iterator
rx_multisocket_handler::remove_socket_unprotected(int fd, fd_set* total_fd_set, int* max_fd)
{ {
if (fd < 0) { if (fd < 0) {
rxSockError("fd to be removed is not valid"); rxSockError("fd to be removed is not valid");
return false; return active_sockets.end();
} }
active_sockets.erase(fd); auto it = active_sockets.find(fd);
it = active_sockets.erase(it);
FD_CLR(fd, total_fd_set); FD_CLR(fd, total_fd_set);
// assumes ordering // assumes ordering
*max_fd = (active_sockets.empty()) ? pipefd[0] : std::max(pipefd[0], active_sockets.rbegin()->first); *max_fd = (active_sockets.empty()) ? pipefd[0] : std::max(pipefd[0], active_sockets.rbegin()->first);
rxSockDebug("Socket fd=%d has been successfully removed", fd); rxSockDebug("Socket fd=%d has been successfully removed", fd);
return true; return it;
} }
void rx_multisocket_handler::run_thread() void rx_multisocket_handler::run_thread()
@ -636,16 +638,19 @@ void rx_multisocket_handler::run_thread()
std::lock_guard<std::mutex> lock(socket_mutex); std::lock_guard<std::mutex> lock(socket_mutex);
// call read callback for all SCTP/TCP/UDP connections // call read callback for all SCTP/TCP/UDP connections
for (auto& handler_pair : active_sockets) { for (auto handler_it = active_sockets.begin(); handler_it != active_sockets.end();) {
int fd = handler_pair.first; int fd = handler_it->first;
recv_task* callback = handler_pair.second.get(); recv_task* callback = handler_it->second.get();
if (not FD_ISSET(fd, &read_fd_set)) { if (not FD_ISSET(fd, &read_fd_set)) {
++handler_it;
continue; continue;
} }
bool socket_valid = callback->operator()(fd); bool socket_valid = callback->operator()(fd);
if (not socket_valid) { if (not socket_valid) {
rxSockInfo("The socket fd=%d has been closed by peer", fd); rxSockInfo("The socket fd=%d has been closed by peer", fd);
remove_socket_unprotected(fd, &total_fd_set, &max_fd); handler_it = remove_socket_unprotected(fd, &total_fd_set, &max_fd);
} else {
++handler_it;
} }
} }

Loading…
Cancel
Save