libgnunetchat

library for GNUnet Messenger
Log | Files | Refs | README | LICENSE

commit 2db1df44bb874044c7b70f873d7eb8698f5644fd
parent b88148bf5c4e693b36148e45221dfd3e7c5d7e24
Author: Jacki <jacki@thejackimonster.de>
Date:   Sat, 20 Jul 2024 23:32:49 +0200

Delay internal message handling

Diffstat:
Msrc/gnunet_chat_handle.c | 11++++++++++-
Msrc/gnunet_chat_handle.h | 2++
Msrc/gnunet_chat_handle_intern.c | 23+++++++++++++++++++++++
3 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/gnunet_chat_handle.c b/src/gnunet_chat_handle.c @@ -262,6 +262,9 @@ handle_destroy (struct GNUNET_CHAT_Handle *handle) if (internal->msg) message_destroy(internal->msg); + if (internal->task) + GNUNET_SCHEDULER_cancel(internal->task); + GNUNET_CONTAINER_DLL_remove( handle->internal_head, handle->internal_tail, @@ -411,6 +414,9 @@ handle_disconnect (struct GNUNET_CHAT_Handle *handle) if (internal->msg) message_destroy(internal->msg); + if (internal->task) + GNUNET_SCHEDULER_cancel(internal->task); + GNUNET_CONTAINER_DLL_remove( handle->internal_head, handle->internal_tail, @@ -796,6 +802,7 @@ handle_send_internal_message (struct GNUNET_CHAT_Handle *handle, struct GNUNET_CHAT_InternalMessages ); + internal->chat = handle; internal->msg = message_create_internally( account, context, flag, warning ); @@ -806,7 +813,9 @@ handle_send_internal_message (struct GNUNET_CHAT_Handle *handle, return; } - handle->msg_cb(handle->msg_cls, context, internal->msg); + internal->task = GNUNET_SCHEDULER_add_now( + on_handle_internal_message_callback, internal + ); if (context) GNUNET_CONTAINER_DLL_insert( diff --git a/src/gnunet_chat_handle.h b/src/gnunet_chat_handle.h @@ -59,7 +59,9 @@ struct GNUNET_CHAT_InternalServices struct GNUNET_CHAT_InternalMessages { + struct GNUNET_CHAT_Handle *chat; struct GNUNET_CHAT_Message *msg; + struct GNUNET_SCHEDULER_Task *task; struct GNUNET_CHAT_InternalMessages *next; struct GNUNET_CHAT_InternalMessages *prev; }; diff --git a/src/gnunet_chat_handle_intern.c b/src/gnunet_chat_handle_intern.c @@ -685,6 +685,29 @@ it_context_iterate_dependencies(void *cls, } void +on_handle_internal_message_callback(void *cls) +{ + struct GNUNET_CHAT_InternalMessages *internal = cls; + + GNUNET_assert( + (internal) && + (internal->chat) && + (internal->msg) && + (internal->task) + ); + + internal->task = NULL; + + struct GNUNET_CHAT_Handle *handle = internal->chat; + struct GNUNET_CHAT_Context *context = internal->msg->context; + + if (!(handle->msg_cb)) + return; + + handle->msg_cb(handle->msg_cls, context, internal->msg); +} + +void on_handle_message_callback(void *cls) { struct GNUNET_CHAT_Message *message = (struct GNUNET_CHAT_Message*) cls;