Skip to content

Commit 7a9022c

Browse files
committed
fix(event):修改examples/event/09_named_pipe示例,去除其HupEvent,并修复epoll存在的bug
1 parent 5c55c4e commit 7a9022c

File tree

5 files changed

+25
-21
lines changed

5 files changed

+25
-21
lines changed

config.mk

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,3 @@ THIRDPARTY += nlohmann
4545

4646
## 编译配置
4747
CCFLAGS += -DENABLE_TRACE_RECORDER=1
48-
49-
## 其它配置
50-
export HAVE_EXECINFO_H = yes
51-
export HAVE_EPOLL = yes

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
);

modules/base/Makefile

Lines changed: 2 additions & 0 deletions
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 # 默认支持execinfo.h
30+
2931
HEAD_FILES = \
3032
version.h \
3133
log.h \

modules/event/engines/epoll/fd_event.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ void EpollFdEvent::OnEventCallback(uint32_t events, void *obj)
149149
EpollFdSharedData *d = static_cast<EpollFdSharedData*>(obj);
150150

151151
short tbox_events = 0;
152+
152153
if (events & EPOLLIN) {
153154
events &= ~EPOLLIN;
154155
tbox_events |= kReadEvent;
@@ -177,12 +178,11 @@ void EpollFdEvent::OnEventCallback(uint32_t events, void *obj)
177178
event->onEvent(tbox_events);
178179

179180
//! 在epoll中,无论有没有监听EPOLLHUP,在对端close了fd时都会触发本端EPOLLHUP事件
180-
//! 只要发生了EPOLLHUB事件,就无法停止它,得强制disable()所有fd关联FdEvent
181+
//! 只要发生了EPOLLHUB事件,只有让上层关闭该事件所有的事件才能停止EPOLLHUP的触发
181182
//! 否则它会一直触发事件,导致Loop空跑,CPU占满问题
182183
if (is_got_hup) {
183184
//! 将HUP事件当成可读事件,上层读到0字节则表示对端已关闭
184185
event->onEvent(kReadEvent);
185-
event->disable(); //! 强制关闭事件
186186
}
187187
}
188188

modules/event/engines/select/loop.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,12 @@ int SelectLoop::fillFdSets(fd_set &read_set, fd_set &write_set, fd_set &except_s
109109
FD_ZERO(&except_set);
110110

111111
for (auto item : fd_data_map_) {
112-
bool is_this_fd_used = false;
113112
auto fd = item.first;
113+
114+
if (fd < 0)
115+
continue;
116+
117+
bool is_this_fd_used = false;
114118
auto data = item.second;
115119

116120
if (data->read_event_num > 0) {

0 commit comments

Comments
 (0)