Skip to content

Commit

Permalink
add event_source_fd_set_fd
Browse files Browse the repository at this point in the history
  • Loading branch information
xianjimli committed Feb 27, 2025
1 parent 8680ac8 commit 0e85a30
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 2 deletions.
4 changes: 4 additions & 0 deletions docs/changes.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# 最新动态

2025/02/27
* 增加event_source_fd对象支持fd为-1和设置fd的情况(感谢智明提供补丁)

2025/02/26
* 修复conf_node的node_type不正确的问题(感谢福明提供补丁)

Expand Down
12 changes: 10 additions & 2 deletions src/tkc/event_source_fd.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ static int32_t event_source_fd_get_fd(event_source_t* source) {
}

static ret_t event_source_fd_check(event_source_t* source) {
return RET_OK;
event_source_fd_t* event_source_fd = EVENT_SOURCE_FD(source);
return event_source_fd->fd >= 0 ? RET_OK : RET_FAIL;
}

static ret_t event_source_fd_dispatch(event_source_t* source) {
Expand All @@ -48,7 +49,7 @@ event_source_t* event_source_fd_create(int fd, event_source_on_event_t on_event,
tk_object_t* obj = NULL;
event_source_t* event_source = NULL;
event_source_fd_t* event_source_fd = NULL;
return_value_if_fail(fd >= 0 && on_event != NULL, NULL);
return_value_if_fail(on_event != NULL, NULL);

obj = tk_object_create(&s_event_source_fd_vtable);
event_source = EVENT_SOURCE(obj);
Expand All @@ -66,3 +67,10 @@ event_source_t* event_source_fd_create(int fd, event_source_on_event_t on_event,

return event_source;
}

ret_t event_source_fd_set_fd(event_source_t* source, int fd) {
event_source_fd_t* event_source_fd = EVENT_SOURCE_FD(source);
return_value_if_fail(event_source_fd != NULL, RET_BAD_PARAMS);
event_source_fd->fd = fd;
return RET_OK;
}
12 changes: 12 additions & 0 deletions src/tkc/event_source_fd.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,18 @@ struct _event_source_fd_t {
*/
event_source_t* event_source_fd_create(int fd, event_source_on_event_t on_event, void* ctx);

/**
* @method event_source_fd_set_fd
*
* 修改事件源的 fd。
*
* @param {event_source_t*} source 事件源对象。
* @param {int} fd 可以用select等待的文件描述符。
*
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
*/
ret_t event_source_fd_set_fd(event_source_t* source, int fd);

#define EVENT_SOURCE_FD(obj) ((event_source_fd_t*)(obj))

END_C_DECLS
Expand Down
30 changes: 30 additions & 0 deletions tests/event_source_fd_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ static ret_t event_source_on_data(event_source_t* source) {
}

TEST(EventSourceFd, basic) {
s_fd_times = 0;
event_source_t* event_source = event_source_fd_create(1, event_source_on_data, NULL);

ASSERT_EQ(event_source_get_fd(event_source), 1);
Expand All @@ -20,3 +21,32 @@ TEST(EventSourceFd, basic) {

tk_object_unref(TK_OBJECT(event_source));
}

TEST(EventSourceFd, none_fd) {
int fd = 2;
s_fd_times = 0;
event_source_t* event_source = event_source_fd_create(-1, event_source_on_data, NULL);
ASSERT_EQ(event_source != NULL, true);
ASSERT_EQ(event_source_fd_set_fd(event_source, fd), RET_OK);

ASSERT_EQ(event_source_get_fd(event_source), fd);
ASSERT_EQ(event_source_check(event_source), RET_OK);
ASSERT_EQ(event_source_get_wakeup_time(event_source), 0xffffu);
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
ASSERT_EQ(s_fd_times, 1u);

ASSERT_EQ(event_source_fd_set_fd(event_source, -1), RET_OK);
ASSERT_EQ(event_source_get_fd(event_source), -1);
ASSERT_EQ(event_source_check(event_source), RET_FAIL);
ASSERT_EQ(s_fd_times, 1u);

ASSERT_EQ(event_source_fd_set_fd(event_source, fd), RET_OK);
ASSERT_EQ(event_source_get_fd(event_source), fd);
ASSERT_EQ(event_source_check(event_source), RET_OK);
ASSERT_EQ(event_source_get_wakeup_time(event_source), 0xffffu);
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
ASSERT_EQ(s_fd_times, 2u);

tk_object_unref(TK_OBJECT(event_source));
}

0 comments on commit 0e85a30

Please sign in to comment.