aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacki <jacki@thejackimonster.de>2024-07-20 23:32:49 +0200
committerJacki <jacki@thejackimonster.de>2024-07-20 23:32:49 +0200
commit2db1df44bb874044c7b70f873d7eb8698f5644fd (patch)
treeb84a99e80ac24bed3fc31af47ac5eb177119e8d1
parentb88148bf5c4e693b36148e45221dfd3e7c5d7e24 (diff)
downloadlibgnunetchat-2db1df44bb874044c7b70f873d7eb8698f5644fd.tar.gz
libgnunetchat-2db1df44bb874044c7b70f873d7eb8698f5644fd.zip
Delay internal message handling
-rw-r--r--src/gnunet_chat_handle.c11
-rw-r--r--src/gnunet_chat_handle.h2
-rw-r--r--src/gnunet_chat_handle_intern.c23
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
60struct GNUNET_CHAT_InternalMessages 60struct 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
687void 687void
688on_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
710void
688on_handle_message_callback(void *cls) 711on_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;