aboutsummaryrefslogtreecommitdiffstats
path: root/libtransport/src/hicn/transport/utils
diff options
context:
space:
mode:
authorMauro Sardara <msardara@cisco.com>2019-03-07 19:11:16 +0100
committerMauro Sardara <msardara@cisco.com>2019-03-08 13:32:22 +0100
commit6aaef596f68a514036d5212fc8697bdaf371e5af (patch)
treed09237bb6810c4aa5eff1a3033633e46bb44e3f6 /libtransport/src/hicn/transport/utils
parent3c6c43ef7bc7caa03540b2347e7f180d5b96ec23 (diff)
[HICN-99] Destroy in the correct order and in the correct event loop the attributes of connectors and sockets. Cleanup of prints.
Change-Id: Ie7eef1d186e581aa950f47df20d57681dc33be55 Signed-off-by: Mauro Sardara <msardara@cisco.com>
Diffstat (limited to 'libtransport/src/hicn/transport/utils')
-rw-r--r--libtransport/src/hicn/transport/utils/epoll_event_reactor.cc61
-rw-r--r--libtransport/src/hicn/transport/utils/epoll_event_reactor.h20
2 files changed, 50 insertions, 31 deletions
diff --git a/libtransport/src/hicn/transport/utils/epoll_event_reactor.cc b/libtransport/src/hicn/transport/utils/epoll_event_reactor.cc
index 6df9e5656..a97e89500 100644
--- a/libtransport/src/hicn/transport/utils/epoll_event_reactor.cc
+++ b/libtransport/src/hicn/transport/utils/epoll_event_reactor.cc
@@ -48,30 +48,6 @@ int EpollEventReactor::addFileDescriptor(int fd, uint32_t events) {
return 0;
}
-int EpollEventReactor::addFileDescriptor(int fd, uint32_t events,
- EventCallback &callback) {
- auto it = event_callback_map_.find(fd);
-
- if (it == event_callback_map_.end()) {
- event_callback_map_[fd] = callback;
- return addFileDescriptor(fd, events);
- }
-
- return 0;
-}
-
-int EpollEventReactor::addFileDescriptor(int fd, uint32_t events,
- EventCallback &&callback) {
- auto it = event_callback_map_.find(fd);
-
- if (it == event_callback_map_.end()) {
- event_callback_map_[fd] = callback;
- return addFileDescriptor(fd, events);
- }
-
- return 0;
-}
-
int EpollEventReactor::modFileDescriptor(int fd, uint32_t events) {
if (TRANSPORT_EXPECT_FALSE(fd < 0)) {
TRANSPORT_LOGE("invalid fd %d", fd);
@@ -109,6 +85,7 @@ int EpollEventReactor::delFileDescriptor(int fd) {
return -1;
}
+ utils::SpinLock::Acquire locked(event_callback_map_lock_);
event_callback_map_.erase(fd);
return 0;
@@ -117,6 +94,8 @@ int EpollEventReactor::delFileDescriptor(int fd) {
void EpollEventReactor::runEventLoop(int timeout) {
Event evt[128];
int en = 0;
+ EventCallbackMap::iterator it;
+ EventCallback callback;
// evt.events = EPOLLIN | EPOLLOUT;
sigset_t sigset;
@@ -134,11 +113,26 @@ void EpollEventReactor::runEventLoop(int timeout) {
for (int i = 0; i < en; i++) {
if (evt[i].data.fd > 0) {
- auto it = event_callback_map_.find(evt[i].data.fd);
+ {
+ utils::SpinLock::Acquire locked(event_callback_map_lock_);
+ it = event_callback_map_.find(evt[i].data.fd);
+ }
+
if (TRANSPORT_EXPECT_FALSE(it == event_callback_map_.end())) {
TRANSPORT_LOGE("unexpected event. fd %d", evt[i].data.fd);
} else {
- event_callback_map_[evt[i].data.fd](evt[i]);
+ {
+ utils::SpinLock::Acquire locked(event_callback_map_lock_);
+ callback = event_callback_map_[evt[i].data.fd];
+ }
+
+ callback(evt[i]);
+
+ // In the callback the epoll event reactor could have been stopped,
+ // then we need to check whether the event loop is still running.
+ if (TRANSPORT_EXPECT_FALSE(!run_event_loop_)) {
+ return;
+ }
}
} else {
TRANSPORT_LOGE("unexpected event. fd %d", evt[i].data.fd);
@@ -150,6 +144,8 @@ void EpollEventReactor::runEventLoop(int timeout) {
void EpollEventReactor::runOneEvent() {
Event evt;
int en = 0;
+ EventCallbackMap::iterator it;
+ EventCallback callback;
// evt.events = EPOLLIN | EPOLLOUT;
sigset_t sigset;
@@ -165,11 +161,20 @@ void EpollEventReactor::runOneEvent() {
}
if (TRANSPORT_EXPECT_TRUE(evt.data.fd > 0)) {
- auto it = event_callback_map_.find(evt.data.fd);
+ {
+ utils::SpinLock::Acquire locked(event_callback_map_lock_);
+ it = event_callback_map_.find(evt.data.fd);
+ }
+
if (TRANSPORT_EXPECT_FALSE(it == event_callback_map_.end())) {
TRANSPORT_LOGE("unexpected event. fd %d", evt.data.fd);
} else {
- event_callback_map_[evt.data.fd](evt);
+ {
+ utils::SpinLock::Acquire locked(event_callback_map_lock_);
+ callback = event_callback_map_[evt.data.fd];
+ }
+
+ callback(evt);
}
} else {
TRANSPORT_LOGE("unexpected event. fd %d", evt.data.fd);
diff --git a/libtransport/src/hicn/transport/utils/epoll_event_reactor.h b/libtransport/src/hicn/transport/utils/epoll_event_reactor.h
index dbb87c6c5..04c10fc7e 100644
--- a/libtransport/src/hicn/transport/utils/epoll_event_reactor.h
+++ b/libtransport/src/hicn/transport/utils/epoll_event_reactor.h
@@ -16,6 +16,7 @@
#pragma once
#include <hicn/transport/utils/event_reactor.h>
+#include <hicn/transport/utils/spinlock.h>
#include <sys/epoll.h>
#include <atomic>
@@ -38,9 +39,22 @@ class EpollEventReactor : public EventReactor {
~EpollEventReactor();
- int addFileDescriptor(int fd, uint32_t events, EventCallback &callback);
+ template <typename EventHandler>
+ int addFileDescriptor(int fd, uint32_t events, EventHandler &&callback) {
+ auto it = event_callback_map_.find(fd);
+ int ret = 0;
- int addFileDescriptor(int fd, uint32_t events, EventCallback &&callback);
+ if (it == event_callback_map_.end()) {
+ {
+ utils::SpinLock::Acquire locked(event_callback_map_lock_);
+ event_callback_map_[fd] = std::forward<EventHandler &&>(callback);
+ }
+
+ ret = addFileDescriptor(fd, events);
+ }
+
+ return ret;
+ }
int delFileDescriptor(int fd);
@@ -60,7 +74,7 @@ class EpollEventReactor : public EventReactor {
int epoll_fd_;
std::atomic_bool run_event_loop_;
EventCallbackMap event_callback_map_;
- std::mutex event_callback_map_mutex_;
+ utils::SpinLock event_callback_map_lock_;
};
} // namespace utils