From 5798474ac1e7e5e41eb525884ecfff7a29f3800a Mon Sep 17 00:00:00 2001 From: licunlong Date: Wed, 31 May 2023 11:13:56 +0800 Subject: [PATCH 5/9] fix: add has_source to events, and use this in socket.watch_fds() to avoid adding same source to events loop. This PR also contains some nonfunctional cleanups --- coms/socket/src/mng.rs | 5 +++-- libs/event/src/events.rs | 16 +++++++++++++++- libs/event/src/poll/epoll.rs | 7 +++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/coms/socket/src/mng.rs b/coms/socket/src/mng.rs index fe77517..aace9c7 100644 --- a/coms/socket/src/mng.rs +++ b/coms/socket/src/mng.rs @@ -576,8 +576,9 @@ impl SocketMng { continue; } let source = Rc::clone(mport); - events.add_source(source).unwrap(); - let source = Rc::clone(mport); + if !events.has_source(source.clone()) { + events.add_source(source.clone()).unwrap(); + } events.set_enabled(source, EventState::On).unwrap(); } } diff --git a/libs/event/src/events.rs b/libs/event/src/events.rs index fba671f..ed7fa1c 100644 --- a/libs/event/src/events.rs +++ b/libs/event/src/events.rs @@ -53,6 +53,11 @@ impl Events { self.data.borrow_mut().add_source(source) } + /// for all: check if the source exists + pub fn has_source(&self, source: Rc) -> bool { + self.data.borrow().has_source(source) + } + /// for all: delete source pub fn del_source(&self, source: Rc) -> Result { self.data.borrow_mut().del_source(source) @@ -233,6 +238,11 @@ impl EventsData { Ok(0) } + pub(self) fn has_source(&self, source: Rc) -> bool { + let token = source.token(); + self.sources.contains_key(&token) + } + pub(self) fn del_source(&mut self, source: Rc) -> Result { self.source_offline(&source)?; @@ -287,7 +297,11 @@ impl EventsData { pub(self) fn set_enabled(&mut self, source: Rc, state: EventState) -> Result { let token = source.token(); - + if let Some(current_state) = self.state.get(&token) { + if current_state == &state { + return Ok(0); + } + } match state { EventState::On | EventState::OneShot => { self.source_online(&source)?; diff --git a/libs/event/src/poll/epoll.rs b/libs/event/src/poll/epoll.rs index 61926df..ad236ed 100644 --- a/libs/event/src/poll/epoll.rs +++ b/libs/event/src/poll/epoll.rs @@ -77,8 +77,11 @@ impl Epoll { } pub(crate) fn register(&mut self, fd: RawFd, event: &mut epoll_event) -> Result<()> { - self.n_sources.fetch_add(1, Ordering::Relaxed); - syscall!(epoll_ctl(self.epoll_fd, EPOLL_CTL_ADD, fd, event)).map(|_| ()) + let res = syscall!(epoll_ctl(self.epoll_fd, EPOLL_CTL_ADD, fd, event)).map(|_| ()); + if res.is_ok() { + self.n_sources.fetch_add(1, Ordering::Relaxed); + } + res } pub(crate) fn reregister(&mut self, fd: RawFd, event: &mut epoll_event) -> Result<()> { -- 2.30.2