@@ -551,7 +551,7 @@ class Reactor : public NonCopyable {
551
551
}
552
552
553
553
void cancel (const TimerId& timer_id) {
554
- m_reactor.callNow ([= ] {
554
+ m_reactor.callNow ([& ] {
555
555
auto i = std::find_if (m_timed_callbacks.begin (), m_timed_callbacks.end (), [&](auto & callback) {
556
556
return callback.second ->id () == timer_id;
557
557
});
@@ -584,7 +584,6 @@ class Reactor : public NonCopyable {
584
584
});
585
585
if (m_thread.joinable ())
586
586
m_thread.join ();
587
- m_wakeup_channel_ptr->disableAll ();
588
587
}
589
588
590
589
auto size () const {
@@ -662,19 +661,19 @@ class Reactor : public NonCopyable {
662
661
return p.second ->fd () == fd;
663
662
});
664
663
if (it != m_work_channels.end ())
665
- return std::pair (it-> first , it-> second ) ;
664
+ return it ;
666
665
auto channel_ptr = std::make_shared<Channel>(*this , fd);
667
666
CallId call_id;
668
- m_work_channels.emplace (call_id, channel_ptr);
669
- return std::pair ( std::move (call_id), std::move (channel_ptr)) ;
667
+ auto ret = m_work_channels.emplace (std::move ( call_id), std::move ( channel_ptr) );
668
+ return ret. first ;
670
669
}
671
670
672
671
public:
673
672
CallId callOnRead (int fd, IoCall&& io_call, bool is_enable_reading = true ) {
674
673
return callNow ([&] {
675
- auto [call_id, channel_ptr] = get (fd);
674
+ auto & [call_id, channel_ptr] = * get (fd);
676
675
std::weak_ptr<Channel> weak_channel_ptr = channel_ptr;
677
- channel_ptr->setReadCallback ([this , weak_channel_ptr = std::move (weak_channel_ptr), fd, call_id , io_call = std::move (io_call)] {
676
+ channel_ptr->setReadCallback ([this , weak_channel_ptr = std::move (weak_channel_ptr), call_id, fd , io_call = std::move (io_call)] {
678
677
auto call_status = io_call (fd, weak_channel_ptr);
679
678
if (call_status == fantasy::Reactor::CallStatus::Remove)
680
679
cancel (call_id);
@@ -689,27 +688,9 @@ class Reactor : public NonCopyable {
689
688
return callOnRead (fd, IoCall (call));
690
689
}
691
690
692
- void callOnEnableReading (const CallId& call_id) {
693
- callNow ([&] {
694
- auto it = m_work_channels.find (call_id);
695
- if (it == m_work_channels.end ())
696
- return ;
697
- it->second ->enableReading ();
698
- });
699
- }
700
-
701
- void callOnEnableWriting (const CallId& call_id) {
702
- callNow ([&] {
703
- auto it = m_work_channels.find (call_id);
704
- if (it == m_work_channels.end ())
705
- return ;
706
- it->second ->enableWriting ();
707
- });
708
- }
709
-
710
691
CallId callOnWrite (int fd, IoCall&& io_call, bool is_enable_writing = false ) {
711
692
return callNow ([&] {
712
- auto [call_id, channel_ptr] = get (fd);
693
+ auto & [call_id, channel_ptr] = * get (fd);
713
694
std::weak_ptr<Channel> weak_channel_ptr = channel_ptr;
714
695
channel_ptr->setWriteCallback ([this , weak_channel_ptr = std::move (weak_channel_ptr), fd, call_id, io_call = std::move (io_call)] {
715
696
auto call_status = io_call (fd, weak_channel_ptr);
@@ -728,7 +709,7 @@ class Reactor : public NonCopyable {
728
709
729
710
CallId callOnClose (int fd, IoCall&& io_call) {
730
711
return callNow ([&] {
731
- auto [call_id, channel_ptr] = get (fd);
712
+ auto & [call_id, channel_ptr] = * get (fd);
732
713
std::weak_ptr<Channel> weak_channel_ptr = channel_ptr;
733
714
channel_ptr->setCloseCallback ([this , weak_channel_ptr = std::move (weak_channel_ptr), fd, call_id, io_call = std::move (io_call)] {
734
715
auto call_status = io_call (fd, weak_channel_ptr);
@@ -745,7 +726,7 @@ class Reactor : public NonCopyable {
745
726
746
727
CallId callOnError (int fd, IoCall&& io_call) {
747
728
return callNow ([&] {
748
- auto [call_id, channel_ptr] = get (fd);
729
+ auto & [call_id, channel_ptr] = * get (fd);
749
730
std::weak_ptr<Channel> weak_channel_ptr = channel_ptr;
750
731
channel_ptr->setErrorCallback ([this , weak_channel_ptr = std::move (weak_channel_ptr), fd, call_id, io_call = std::move (io_call)] {
751
732
auto call_status = io_call (fd, weak_channel_ptr);
@@ -763,7 +744,7 @@ class Reactor : public NonCopyable {
763
744
template <typename T>
764
745
void cancel (const T& id) {
765
746
if constexpr (std::is_same_v<T, CallId>) {
766
- callNow ([this , id ] {
747
+ callNow ([& ] {
767
748
if (auto it = m_work_channels.find (id); it != m_work_channels.end ()) {
768
749
it->second ->disableAll ();
769
750
m_release_channel.emplace_back (std::move (it->second ));
@@ -776,12 +757,10 @@ class Reactor : public NonCopyable {
776
757
}
777
758
778
759
void run () {
779
- m_timer_queue_ptr = std::make_unique<TimerManager>(*this );
780
- m_wakeup_channel_ptr = std::make_unique<Channel>(*this , m_wakeup_fd_ptr[0 ]);
781
- m_wakeup_channel_ptr->setReadCallback (std::bind (&Reactor::wakeupRead, this ));
782
- m_wakeup_channel_ptr->enableReading ();
783
760
m_thread = std::thread ([&] {
784
761
m_thread_id = std::this_thread::get_id ();
762
+ m_timer_queue_ptr = std::make_unique<TimerManager>(*this );
763
+ auto call_id = callOnRead (m_wakeup_fd_ptr[0 ], [&](int fd, const std::weak_ptr<Channel>&) { wakeupRead (fd); return CallStatus::Ok; });
785
764
try {
786
765
for (;;) {
787
766
auto active_channels = m_epoller_ptr->poll (-1 );
@@ -793,6 +772,7 @@ class Reactor : public NonCopyable {
793
772
}
794
773
} catch (const Shutdown&) {
795
774
std::lock_guard<std::mutex> lk (m_mtx);
775
+ cancel (call_id);
796
776
for (auto & func : m_pending_functors)
797
777
func ();
798
778
}
@@ -815,9 +795,9 @@ class Reactor : public NonCopyable {
815
795
m_epoller_ptr->updateChannel (channel);
816
796
}
817
797
818
- void wakeupRead () {
798
+ void wakeupRead (const int & fd ) {
819
799
char c;
820
- if (read (m_wakeup_fd_ptr[ 0 ] , &c, sizeof (c)) == -1 && m_error_callback)
800
+ if (read (fd , &c, sizeof (c)) == -1 && m_error_callback)
821
801
m_error_callback (__FILE__, __LINE__, errno);
822
802
std::unique_lock<std::mutex> lk (m_mtx);
823
803
auto pending_functors = std::move (m_pending_functors);
@@ -828,7 +808,6 @@ class Reactor : public NonCopyable {
828
808
829
809
std::unique_ptr<Epoll> m_epoller_ptr;
830
810
std::unique_ptr<int [], std::function<void (int *)>> m_wakeup_fd_ptr;
831
- std::unique_ptr<Channel> m_wakeup_channel_ptr;
832
811
std::thread::id m_thread_id;
833
812
std::thread m_thread;
834
813
std::vector<Functor> m_pending_functors;
@@ -846,4 +825,4 @@ class Reactor : public NonCopyable {
846
825
847
826
} // namespace fantasy
848
827
849
- #endif // _REACTOR_HPP_INCLUD_ED
828
+ #endif // _REACTOR_HPP_INCLUD_ED
0 commit comments