Skip to content

Commit 2c58d69

Browse files
committed
Merge branch 'master' of gitee.com:cpp-master/cpp-tbox
2 parents d23ba61 + c0c8383 commit 2c58d69

40 files changed

+740
-113
lines changed

examples/event/09_named_pipe/main.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,28 +41,31 @@ using namespace tbox::event;
4141

4242
void PrintUsage(const char *process_name)
4343
{
44-
cout << "Usage:" << process_name << " your_pipefile" << endl;
44+
cout << "Usage:" << process_name << " epoll|select your_pipefile" << endl;
4545
}
4646

4747
int main(int argc, char *argv[])
4848
{
49-
if (argc < 2) {
49+
if (argc < 3) {
5050
PrintUsage(argv[0]);
5151
return 0;
5252
}
5353

5454
LogOutput_Enable();
55-
Loop* sp_loop = Loop::New();
55+
Loop* sp_loop = Loop::New(argv[1]);
56+
57+
const char* pipe_file = argv[2];
58+
::unlink(pipe_file);
5659

57-
const char* pipe_file = argv[1];
5860
int ret = mkfifo(pipe_file, 0666);
5961
if (ret != 0) {
6062
LogWarn("mkfifo() ret:%d, errno:%d", ret, errno);
6163
}
6264
int fd = open(pipe_file, O_RDONLY|O_NDELAY);
65+
LogDbg("fd:%d", fd);
6366

6467
FdEvent* sp_fd_read = sp_loop->newFdEvent();
65-
sp_fd_read->initialize(fd, FdEvent::kReadEvent | FdEvent::kHupEvent, Event::Mode::kPersist); //! 可读与挂起事件一直有效
68+
sp_fd_read->initialize(fd, FdEvent::kReadEvent, Event::Mode::kPersist); //! 可读与挂起事件一直有效
6669
sp_fd_read->enable();
6770

6871
sp_fd_read->setCallback(
@@ -75,16 +78,15 @@ int main(int argc, char *argv[])
7578
input_buff[rsize - 1] = '\0';
7679
LogInfo("read[%d]:%s", rsize, input_buff);
7780
} else {
78-
LogInfo("read 0");
79-
}
80-
}
81+
LogNotice("read 0");
82+
sp_fd_read->disable();
83+
close(fd);
8184

82-
//! 当管道断开的时候
83-
if (event & FdEvent::kHupEvent) {
84-
LogNotice("hup");
85-
fd = open(pipe_file, O_RDONLY|O_NDELAY);
86-
sp_fd_read->initialize(fd, FdEvent::kReadEvent | FdEvent::kHupEvent, Event::Mode::kPersist);
87-
sp_fd_read->enable();
85+
fd = open(pipe_file, O_RDONLY|O_NDELAY);
86+
LogDbg("fd:%d", fd);
87+
sp_fd_read->initialize(fd, FdEvent::kReadEvent, Event::Mode::kPersist);
88+
sp_fd_read->enable();
89+
}
8890
}
8991
}
9092
);

examples/terminal/tcp_rpc/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ int main(int argc, char **argv)
5050
auto sp_loop = Loop::New();
5151
SetScopeExitAction([sp_loop] { delete sp_loop; });
5252

53-
Terminal term;
53+
Terminal term(sp_loop);
5454
term.setWelcomeText("Welcome to Terminal TcpRPC demo! \r\n");
5555
TcpRpc rpc(sp_loop, &term);
5656
if (!rpc.initialize(bind_addr)) {

examples/terminal/telnetd/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ int main(int argc, char **argv)
5050
auto sp_loop = Loop::New();
5151
SetScopeExitAction([sp_loop] { delete sp_loop; });
5252

53-
Terminal term;
53+
Terminal term(sp_loop);
5454
term.setWelcomeText("Welcome to Terminal Telnet demo! \r\n");
5555
Telnetd telnetd(sp_loop, &term);
5656
if (!telnetd.initialize(bind_addr)) {

modules/base/Makefile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ LIB_VERSION_X = 1
2626
LIB_VERSION_Y = 0
2727
LIB_VERSION_Z = 1
2828

29+
HAVE_EXECINFO_H ?= yes
30+
2931
HEAD_FILES = \
3032
version.h \
3133
log.h \
@@ -58,7 +60,11 @@ CPP_SRC_FILES = \
5860
pre_build:
5961
touch version.cpp
6062

61-
CXXFLAGS := -DMODULE_ID='"tbox.base"' $(CXXFLAGS)
63+
CXXFLAGS += -DMODULE_ID='"tbox.base"'
64+
65+
ifeq ($(HAVE_EXECINFO_H),yes)
66+
CXXFLAGS += -DHAVE_EXECINFO_H=1
67+
endif
6268

6369
TEST_CPP_SRC_FILES = \
6470
$(CPP_SRC_FILES) \

modules/base/backtrace.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#endif //HAVE_EXECINFO_H
3939

4040
#include <sstream>
41+
#include "defines.h"
4142

4243
namespace tbox {
4344

@@ -82,6 +83,7 @@ std::string DumpBacktrace(const unsigned int max_frames)
8283
oss << "[truncated]" << std::endl;
8384

8485
#else
86+
UNUSED_VAR(max_frames);
8587
oss << "not support backtrace" << std::endl;
8688
#endif //HAVE_EXECINFO_H
8789

modules/event/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ set(TBOX_EVENT_SOURCES
4949
misc.cpp
5050
stat.cpp
5151
engines/epoll/loop.cpp
52-
engines/epoll/fd_event.cpp)
52+
engines/epoll/fd_event.cpp
53+
engines/select/loop.cpp
54+
engines/select/fd_event.cpp)
5355

5456
set(TBOX_EVENT_TEST_SOURCES
5557
common_loop_test.cpp

modules/event/Makefile

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,12 @@
2121
PROJECT = event
2222
LIB_NAME = event
2323
LIB_VERSION_X = 1
24-
LIB_VERSION_Y = 1
25-
LIB_VERSION_Z = 2
24+
LIB_VERSION_Y = 2
25+
LIB_VERSION_Z = 0
26+
27+
HAVE_EPOLL ?= yes
28+
29+
CXXFLAGS += -DMODULE_ID='"tbox.event"'
2630

2731
HEAD_FILES = \
2832
forward.h \
@@ -43,8 +47,16 @@ CPP_SRC_FILES = \
4347
signal_event_impl.cpp \
4448
misc.cpp \
4549
stat.cpp \
50+
engines/select/loop.cpp \
51+
engines/select/fd_event.cpp \
52+
53+
ifeq ($(HAVE_EPOLL),yes)
54+
CXXFLAGS += -DHAVE_EPOLL=1
55+
56+
CPP_SRC_FILES += \
4657
engines/epoll/loop.cpp \
47-
engines/epoll/fd_event.cpp \
58+
engines/epoll/fd_event.cpp
59+
endif
4860

4961
TEST_CPP_SRC_FILES = \
5062
$(CPP_SRC_FILES) \
@@ -53,7 +65,6 @@ TEST_CPP_SRC_FILES = \
5365
timer_event_test.cpp \
5466
signal_event_test.cpp \
5567

56-
CXXFLAGS := -DMODULE_ID='"tbox.event"' $(CXXFLAGS)
5768

5869
TEST_LDFLAGS := $(LDFLAGS) -ltbox_base -ldl
5970

modules/event/engines/epoll/fd_event.cpp

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ bool EpollFdEvent::enable()
7979
if (events_ & kExceptEvent)
8080
++d_->except_event_num;
8181

82-
if (events_ & kHupEvent)
83-
++d_->hup_event_num;
84-
8582
d_->fd_events.push_back(this);
8683

8784
reloadEpoll();
@@ -104,9 +101,6 @@ bool EpollFdEvent::disable()
104101
if (events_ & kExceptEvent)
105102
--d_->except_event_num;
106103

107-
if (events_ & kHupEvent)
108-
--d_->hup_event_num;
109-
110104
auto iter = std::find(d_->fd_events.begin(), d_->fd_events.end(), this);
111105
d_->fd_events.erase(iter);
112106

@@ -136,9 +130,6 @@ void EpollFdEvent::reloadEpoll()
136130
if (d_->except_event_num > 0)
137131
new_events |= EPOLLERR;
138132

139-
if (d_->hup_event_num > 0)
140-
new_events |= EPOLLHUP;
141-
142133
d_->ev.events = new_events;
143134

144135
if (old_events == 0) {
@@ -158,6 +149,7 @@ void EpollFdEvent::OnEventCallback(uint32_t events, void *obj)
158149
EpollFdSharedData *d = static_cast<EpollFdSharedData*>(obj);
159150

160151
short tbox_events = 0;
152+
161153
if (events & EPOLLIN) {
162154
events &= ~EPOLLIN;
163155
tbox_events |= kReadEvent;
@@ -173,29 +165,33 @@ void EpollFdEvent::OnEventCallback(uint32_t events, void *obj)
173165
tbox_events |= kExceptEvent;
174166
}
175167

168+
bool is_got_hup = false;
169+
176170
if (events & EPOLLHUP) {
177171
events &= ~EPOLLHUP;
178-
tbox_events |= kHupEvent;
172+
is_got_hup = true;
179173
}
180174

181175
//! 要先复制一份,因为在for中很可能会改动到d->fd_events,引起迭代器失效问题
182176
auto tmp = d->fd_events;
183-
for (auto event : tmp)
177+
for (auto event : tmp) {
184178
event->onEvent(tbox_events);
185179

180+
//! 在epoll中,无论有没有监听EPOLLHUP,在对端close了fd时都会触发本端EPOLLHUP事件
181+
//! 只要发生了EPOLLHUB事件,只有让上层关闭该事件所有的事件才能停止EPOLLHUP的触发
182+
//! 否则它会一直触发事件,导致Loop空跑,CPU占满问题
183+
if (is_got_hup) {
184+
//! 将HUP事件当成可读事件,上层读到0字节则表示对端已关闭
185+
event->onEvent(kReadEvent);
186+
}
187+
}
188+
186189
if (events)
187190
LogWarn("unhandle events:%08X, fd:%d", events, d->fd);
188191
}
189192

190193
void EpollFdEvent::onEvent(short events)
191194
{
192-
/**
193-
* 由于EPOLLHUP会一直触发,所以无论事件有没有监听HupEvent,只要发生了EPOLLHUB事件,
194-
* 对应fd所有的事件都要强制disable()。否则会导致Loop空跑问题。
195-
*/
196-
if (events & kHupEvent)
197-
disable();
198-
199195
if (events_ & events) {
200196
if (is_stop_after_trigger_)
201197
disable();

modules/event/engines/epoll/types.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ struct EpollFdSharedData {
3737
int read_event_num = 0; //!< 监听可读事件的FdEvent个数
3838
int write_event_num = 0; //!< 监听可写事件的FdEvent个数
3939
int except_event_num = 0; //!< 监听异常事件的FdEvent个数
40-
int hup_event_num = 0; //!< 监听挂起事件的FdEvent个数
4140

4241
std::vector<EpollFdEvent*> fd_events;
4342
};

0 commit comments

Comments
 (0)