diff options
author | Jacki <jacki@thejackimonster.de> | 2024-07-20 23:32:49 +0200 |
---|---|---|
committer | Jacki <jacki@thejackimonster.de> | 2024-07-20 23:32:49 +0200 |
commit | 2db1df44bb874044c7b70f873d7eb8698f5644fd (patch) | |
tree | b84a99e80ac24bed3fc31af47ac5eb177119e8d1 | |
parent | b88148bf5c4e693b36148e45221dfd3e7c5d7e24 (diff) | |
download | libgnunetchat-2db1df44bb874044c7b70f873d7eb8698f5644fd.tar.gz libgnunetchat-2db1df44bb874044c7b70f873d7eb8698f5644fd.zip |
Delay internal message handling
-rw-r--r-- | src/gnunet_chat_handle.c | 11 | ||||
-rw-r--r-- | src/gnunet_chat_handle.h | 2 | ||||
-rw-r--r-- | src/gnunet_chat_handle_intern.c | 23 |
3 files changed, 35 insertions, 1 deletions
diff --git a/src/gnunet_chat_handle.c b/src/gnunet_chat_handle.c index 605287f..70f68ff 100644 --- a/src/gnunet_chat_handle.c +++ b/src/gnunet_chat_handle.c | |||
@@ -262,6 +262,9 @@ handle_destroy (struct GNUNET_CHAT_Handle *handle) | |||
262 | if (internal->msg) | 262 | if (internal->msg) |
263 | message_destroy(internal->msg); | 263 | message_destroy(internal->msg); |
264 | 264 | ||
265 | if (internal->task) | ||
266 | GNUNET_SCHEDULER_cancel(internal->task); | ||
267 | |||
265 | GNUNET_CONTAINER_DLL_remove( | 268 | GNUNET_CONTAINER_DLL_remove( |
266 | handle->internal_head, | 269 | handle->internal_head, |
267 | handle->internal_tail, | 270 | handle->internal_tail, |
@@ -411,6 +414,9 @@ handle_disconnect (struct GNUNET_CHAT_Handle *handle) | |||
411 | if (internal->msg) | 414 | if (internal->msg) |
412 | message_destroy(internal->msg); | 415 | message_destroy(internal->msg); |
413 | 416 | ||
417 | if (internal->task) | ||
418 | GNUNET_SCHEDULER_cancel(internal->task); | ||
419 | |||
414 | GNUNET_CONTAINER_DLL_remove( | 420 | GNUNET_CONTAINER_DLL_remove( |
415 | handle->internal_head, | 421 | handle->internal_head, |
416 | handle->internal_tail, | 422 | handle->internal_tail, |
@@ -796,6 +802,7 @@ handle_send_internal_message (struct GNUNET_CHAT_Handle *handle, | |||
796 | struct GNUNET_CHAT_InternalMessages | 802 | struct GNUNET_CHAT_InternalMessages |
797 | ); | 803 | ); |
798 | 804 | ||
805 | internal->chat = handle; | ||
799 | internal->msg = message_create_internally( | 806 | internal->msg = message_create_internally( |
800 | account, context, flag, warning | 807 | account, context, flag, warning |
801 | ); | 808 | ); |
@@ -806,7 +813,9 @@ handle_send_internal_message (struct GNUNET_CHAT_Handle *handle, | |||
806 | return; | 813 | return; |
807 | } | 814 | } |
808 | 815 | ||
809 | handle->msg_cb(handle->msg_cls, context, internal->msg); | 816 | internal->task = GNUNET_SCHEDULER_add_now( |
817 | on_handle_internal_message_callback, internal | ||
818 | ); | ||
810 | 819 | ||
811 | if (context) | 820 | if (context) |
812 | GNUNET_CONTAINER_DLL_insert( | 821 | GNUNET_CONTAINER_DLL_insert( |
diff --git a/src/gnunet_chat_handle.h b/src/gnunet_chat_handle.h index 4874230..7b09da9 100644 --- a/src/gnunet_chat_handle.h +++ b/src/gnunet_chat_handle.h | |||
@@ -59,7 +59,9 @@ struct GNUNET_CHAT_InternalServices | |||
59 | 59 | ||
60 | struct GNUNET_CHAT_InternalMessages | 60 | struct GNUNET_CHAT_InternalMessages |
61 | { | 61 | { |
62 | struct GNUNET_CHAT_Handle *chat; | ||
62 | struct GNUNET_CHAT_Message *msg; | 63 | struct GNUNET_CHAT_Message *msg; |
64 | struct GNUNET_SCHEDULER_Task *task; | ||
63 | struct GNUNET_CHAT_InternalMessages *next; | 65 | struct GNUNET_CHAT_InternalMessages *next; |
64 | struct GNUNET_CHAT_InternalMessages *prev; | 66 | struct GNUNET_CHAT_InternalMessages *prev; |
65 | }; | 67 | }; |
diff --git a/src/gnunet_chat_handle_intern.c b/src/gnunet_chat_handle_intern.c index b09f045..4d68043 100644 --- a/src/gnunet_chat_handle_intern.c +++ b/src/gnunet_chat_handle_intern.c | |||
@@ -685,6 +685,29 @@ it_context_iterate_dependencies(void *cls, | |||
685 | } | 685 | } |
686 | 686 | ||
687 | void | 687 | void |
688 | on_handle_internal_message_callback(void *cls) | ||
689 | { | ||
690 | struct GNUNET_CHAT_InternalMessages *internal = cls; | ||
691 | |||
692 | GNUNET_assert( | ||
693 | (internal) && | ||
694 | (internal->chat) && | ||
695 | (internal->msg) && | ||
696 | (internal->task) | ||
697 | ); | ||
698 | |||
699 | internal->task = NULL; | ||
700 | |||
701 | struct GNUNET_CHAT_Handle *handle = internal->chat; | ||
702 | struct GNUNET_CHAT_Context *context = internal->msg->context; | ||
703 | |||
704 | if (!(handle->msg_cb)) | ||
705 | return; | ||
706 | |||
707 | handle->msg_cb(handle->msg_cls, context, internal->msg); | ||
708 | } | ||
709 | |||
710 | void | ||
688 | on_handle_message_callback(void *cls) | 711 | on_handle_message_callback(void *cls) |
689 | { | 712 | { |
690 | struct GNUNET_CHAT_Message *message = (struct GNUNET_CHAT_Message*) cls; | 713 | struct GNUNET_CHAT_Message *message = (struct GNUNET_CHAT_Message*) cls; |