commit 2db1df44bb874044c7b70f873d7eb8698f5644fd
parent b88148bf5c4e693b36148e45221dfd3e7c5d7e24
Author: Jacki <jacki@thejackimonster.de>
Date: Sat, 20 Jul 2024 23:32:49 +0200
Delay internal message handling
Diffstat:
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;