improve idle/timer

This commit is contained in:
lixianjing 2022-09-14 16:04:51 +08:00
parent 3ed0669efb
commit 77d0c9ba65
12 changed files with 109 additions and 14 deletions

View File

@ -1,4 +1,6 @@
# 最新动态
2022/09/14
* 支持在添加idle和添加timer是指定ID(感谢智明提供补丁)
2022/09/11
* widget 的虚表 only\_active\_children 属性改为 widget\_get\_only\_active\_children\_t 函数指针(感谢智明提供补丁)

View File

@ -45,7 +45,7 @@ static const object_vtable_t s_idle_info_vtable = {
.is_collection = FALSE,
.on_destroy = (tk_object_on_destroy_t)idle_info_on_destroy};
idle_info_t* idle_info_create(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
idle_info_t* idle_info_create(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
uint16_t idle_info_type) {
tk_object_t* obj = tk_object_create(&s_idle_info_vtable);
idle_info_t* idle = IDLE_INFO(obj);
@ -56,7 +56,6 @@ idle_info_t* idle_info_create(idle_manager_t* idle_manager, idle_func_t on_idle,
idle->idle_info_type = idle_info_type;
if (idle_manager != NULL) {
uint32_t id = idle_manager_get_next_idle_id(idle_manager);
idle->id = id;
if (id != TK_INVALID_ID) {

View File

@ -118,7 +118,7 @@ idle_info_t* idle_info_init_dummy_with_ctx_and_type(idle_info_t* idle, uint16_t
void* ctx);
ret_t idle_info_on_idle(idle_info_t* idle, uint32_t dispatch_id);
bool_t idle_info_is_available(idle_info_t* idle, uint32_t dispatch_id);
idle_info_t* idle_info_create(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
idle_info_t* idle_info_create(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
uint16_t idle_info_type);
#define IDLE_INFO(o) ((idle_info_t*)(o))

View File

@ -109,13 +109,31 @@ uint32_t idle_manager_add(idle_manager_t* idle_manager, idle_func_t on_idle, voi
return idle_manager_add_with_type(idle_manager, on_idle, ctx, IDLE_INFO_NORMAL);
}
uint32_t idle_manager_add_with_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx) {
return idle_manager_add_with_type_and_id(idle_manager, id, on_idle, ctx, IDLE_INFO_NORMAL, TRUE);
}
uint32_t idle_manager_add_with_type(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
uint16_t type) {
uint32_t id = TK_INVALID_ID;
return_value_if_fail(idle_manager != NULL, TK_INVALID_ID);
id = idle_manager_get_next_idle_id(idle_manager);
return idle_manager_add_with_type_and_id(idle_manager, id, on_idle, ctx, type, FALSE);
}
uint32_t idle_manager_add_with_type_and_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
uint16_t type, bool_t check_id) {
idle_info_t* idle = NULL;
return_value_if_fail(on_idle != NULL, TK_INVALID_ID);
return_value_if_fail(idle_manager != NULL, TK_INVALID_ID);
if (check_id) {
if (idle_manager_find(idle_manager, id) != NULL) {
return TK_INVALID_ID;
}
}
idle = idle_info_create(idle_manager, on_idle, ctx, type);
idle = idle_info_create(idle_manager, id, on_idle, ctx, type);
return_value_if_fail(idle != NULL, TK_INVALID_ID);
return idle->id;

View File

@ -169,9 +169,28 @@ const idle_info_t* idle_manager_find(idle_manager_t* idle_manager, uint32_t idle
*/
uint32_t idle_manager_add(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx);
/*internal use*/
/**
* @method idle_manager_add_with_id
* idle idle_id idle_id
* @param {idle_manager_t*} idle_manager idle_manager_t管理器对象
* @param {uint32_t} id idle_id
* @param {idle_func_t*} on_idle idle回调函数
* @param {void*} ctx idle回调函数的上下文
*
* @return {uint32_t} idle的IDTK_INVALID_ID表示失败
*/
uint32_t idle_manager_add_with_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx);
/**
* @method idle_manager_get_next_idle_id
* idle_id
* @param {idle_manager_t*} idle_manager idle_manager_t管理器对象
*
* @return {uint32_t} idle的IDTK_INVALID_ID表示失败
*/
uint32_t idle_manager_get_next_idle_id(idle_manager_t* idle_manager);
/*internal use*/
/**
* @method idle_manager_remove_all_by_ctx_and_type
*/
@ -182,6 +201,11 @@ ret_t idle_manager_remove_all_by_ctx_and_type(idle_manager_t* idle_manager, uint
*/
uint32_t idle_manager_add_with_type(idle_manager_t* idle_manager, idle_func_t on_idle, void* ctx,
uint16_t type);
/**
* @method idle_manager_add_with_type_and_id
*/
uint32_t idle_manager_add_with_type_and_id(idle_manager_t* idle_manager, uint32_t id, idle_func_t on_idle, void* ctx,
uint16_t type, bool_t check_id);
/**
* @method idle_manager_exist
*/

View File

@ -45,7 +45,7 @@ static const object_vtable_t s_timer_info_vtable = {
.is_collection = FALSE,
.on_destroy = (tk_object_on_destroy_t)timer_info_on_destroy};
timer_info_t* timer_info_create(timer_manager_t* tm, timer_func_t on_timer, void* ctx,
timer_info_t* timer_info_create(timer_manager_t* tm, uint32_t id, timer_func_t on_timer, void* ctx,
uint32_t duration, uint16_t timer_info_type) {
tk_object_t* obj = tk_object_create(&s_timer_info_vtable);
timer_info_t* timer = TIMER_INFO(obj);
@ -58,7 +58,6 @@ timer_info_t* timer_info_create(timer_manager_t* tm, timer_func_t on_timer, void
timer->timer_info_type = timer_info_type;
if (tm != NULL) {
uint32_t id = timer_manager_get_next_timer_id(tm);
timer->id = id;
timer->timer_manager = tm;
timer->start = tm->get_time();

View File

@ -151,7 +151,7 @@ int timer_info_compare_by_ctx_and_type(const void* a, const void* b);
timer_info_t* timer_info_init_dummy(timer_info_t* timer, uint32_t id);
timer_info_t* timer_info_init_dummy_with_ctx_and_type(timer_info_t* timer, uint16_t type,
void* ctx);
timer_info_t* timer_info_create(timer_manager_t* tm, timer_func_t on_timer, void* ctx,
timer_info_t* timer_info_create(timer_manager_t* tm, uint32_t id, timer_func_t on_timer, void* ctx,
uint32_t duration, uint16_t timer_info_type);
ret_t timer_info_on_timer(timer_info_t* timer, uint64_t now);

View File

@ -95,13 +95,31 @@ uint32_t timer_manager_add(timer_manager_t* timer_manager, timer_func_t on_timer
return timer_manager_add_with_type(timer_manager, on_timer, ctx, duration, TIMER_INFO_NORMAL);
}
uint32_t timer_manager_add_with_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer, void* ctx,
uint32_t duration) {
return timer_manager_add_with_type_and_id(timer_manager, id, on_timer, ctx, duration, TIMER_INFO_NORMAL, TRUE);
}
uint32_t timer_manager_add_with_type(timer_manager_t* timer_manager, timer_func_t on_timer,
void* ctx, uint32_t duration, uint16_t timer_info_type) {
uint32_t id = timer_manager_get_next_timer_id(timer_manager);
return timer_manager_add_with_type_and_id(timer_manager, id, on_timer, ctx, duration, timer_info_type, FALSE);
}
uint32_t timer_manager_add_with_type_and_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer,
void* ctx, uint32_t duration, uint16_t timer_info_type, bool_t is_check_id) {
timer_info_t* timer = NULL;
return_value_if_fail(on_timer != NULL, TK_INVALID_ID);
return_value_if_fail(id != TK_INVALID_ID, TK_INVALID_ID);
return_value_if_fail(timer_manager != NULL, TK_INVALID_ID);
timer = timer_info_create(timer_manager, on_timer, ctx, duration, timer_info_type);
if (is_check_id) {
if (timer_manager_find(timer_manager, id) != NULL) {
return TK_INVALID_ID;
}
}
timer = timer_info_create(timer_manager, id, on_timer, ctx, duration, timer_info_type);
return_value_if_fail(timer != NULL, TK_INVALID_ID);
return timer->id;

View File

@ -110,6 +110,20 @@ ret_t timer_manager_destroy(timer_manager_t* timer_manager);
uint32_t timer_manager_add(timer_manager_t* timer_manager, timer_func_t on_timer, void* ctx,
uint32_t duration);
/**
* @method timer_manager_add_with_id
* timer_id timer_id
* @param {timer_manager_t*} timer_manager
* @param {uint32_t} id timer_id
* @param {timer_func_t*} on_timer timer回调函数
* @param {void*} ctx timer回调函数的上下文
* @param {uint32_t} duration
*
* @return {uint32_t} timer的IDTK_INVALID_ID表示失败
*/
uint32_t timer_manager_add_with_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer, void* ctx,
uint32_t duration);
/**
* @method timer_manager_remove
* id删除定时器
@ -186,11 +200,16 @@ uint64_t timer_manager_next_time(timer_manager_t* timer_manager);
*/
ret_t timer_manager_append(timer_manager_t* timer_manager, timer_info_t* timer);
/*internal use*/
/**
* @method timer_manager_get_next_timer_id
* @method timer_manager_get_next_timer_id
* timer_id
* @param {timer_manager_t*} timer_manager timer_manager_t管理器对象
*
* @return {uint32_t} idle的IDTK_INVALID_ID表示失败
*/
uint32_t timer_manager_get_next_timer_id(timer_manager_t* timer_manager);
/*internal use*/
/**
* @method timer_manager_all_remove_by_ctx_and_type
*/
@ -201,6 +220,11 @@ ret_t timer_manager_all_remove_by_ctx_and_type(timer_manager_t* timer_manager, u
*/
uint32_t timer_manager_add_with_type(timer_manager_t* timer_manager, timer_func_t on_timer,
void* ctx, uint32_t duration, uint16_t timer_info_type);
/**
* @method timer_manager_add_with_type_and_id
*/
uint32_t timer_manager_add_with_type_and_id(timer_manager_t* timer_manager, uint32_t id, timer_func_t on_timer,
void* ctx, uint32_t duration, uint16_t timer_info_type, bool_t is_check_id);
END_C_DECLS

View File

@ -18,11 +18,16 @@ TEST(EventSourceIdle, basic) {
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
ASSERT_EQ(s_idle_times, 0u);
uint32_t id = idle_manager_get_next_idle_id(tm);
ASSERT_EQ(id != TK_INVALID_ID, TRUE);
ASSERT_EQ(idle_manager_add_with_id(tm, id, idle_once, NULL), id);
ASSERT_EQ(idle_manager_add_with_id(tm, id, idle_once, NULL), TK_INVALID_ID);
idle_manager_add(tm, idle_once, NULL);
ASSERT_EQ(event_source_get_wakeup_time(event_source), 0u);
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
ASSERT_EQ(s_idle_times, 1u);
ASSERT_EQ(s_idle_times, 2u);
tk_object_unref(TK_OBJECT(event_source));
idle_manager_destroy(tm);

View File

@ -20,6 +20,12 @@ static ret_t timer_once(const timer_info_t* timer) {
TEST(EventSourceTimer, basic) {
timer_manager_t* tm = timer_manager_create(timer_get_time);
timer_manager_add(tm, timer_once, NULL, 100);
uint32_t id = timer_manager_get_next_timer_id(tm);
ASSERT_EQ(id != TK_INVALID_ID, TRUE);
ASSERT_EQ(timer_manager_add_with_id(tm, id, timer_once, NULL, 100), id);
ASSERT_EQ(timer_manager_add_with_id(tm, id, timer_once, NULL, 100), TK_INVALID_ID);
event_source_t* event_source = event_source_timer_create(tm);
ASSERT_EQ(event_source_get_fd(event_source), -1);
ASSERT_EQ(event_source_check(event_source), RET_OK);
@ -29,7 +35,7 @@ TEST(EventSourceTimer, basic) {
timer_set_time(100);
ASSERT_EQ(event_source_dispatch(event_source), RET_OK);
ASSERT_EQ(s_timer_times, 1u);
ASSERT_EQ(s_timer_times, 2u);
tk_object_unref(TK_OBJECT(event_source));
timer_manager_destroy(tm);

View File

@ -11,7 +11,7 @@ static ret_t on_timer(const timer_info_t* timer) {
TEST(TimerInfo, basic) {
timer_info_t dummy;
timer_info_t* timer = timer_info_create(NULL, on_timer, NULL, 1000, TIMER_INFO_NORMAL);
timer_info_t* timer = timer_info_create(NULL, 1, on_timer, NULL, 1000, TIMER_INFO_NORMAL);
ASSERT_EQ(timer->duration, 1000u);
ASSERT_EQ(timer_info_compare_by_id(timer, timer), 0);