mirror of https://github.com/PentHertz/srsLTE.git
fix enb crash during close down of enb and epc
This commit is contained in:
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…
Reference in New Issue