messenger-gtk

Gtk+3 graphical user interfaces for GNUnet Messenger
Log | Files | Refs | Submodules | README | LICENSE

commit b9190cafb93a96fddf414b75a3d68953c6409d5c
parent a45f482e6d2786575a2a84a9a7ec55c2ddfc4c91
Author: Jacki <jacki@thejackimonster.de>
Date:   Mon, 29 Jul 2024 15:39:06 +0200

Optimize thread synchronization further by reducing syscalls

Signed-off-by: Jacki <jacki@thejackimonster.de>

Diffstat:
Msrc/schedule.c | 35+++++++++++++++--------------------
Msrc/schedule.h | 1-
2 files changed, 15 insertions(+), 21 deletions(-)

diff --git a/src/schedule.c b/src/schedule.c @@ -156,7 +156,6 @@ schedule_init(MESSENGER_Schedule *schedule) memset(schedule, 0, sizeof(MESSENGER_Schedule)); signal_init(&(schedule->push_signal)); - signal_init(&(schedule->sync_signal)); semaphore_init(&(schedule->push_sem), 0); semaphore_init(&(schedule->sync_sem), 0); @@ -185,9 +184,8 @@ __schedule_pushed_handling(MESSENGER_Schedule *schedule, keep = TRUE; - semaphore_down(&(schedule->push_sem)); semaphore_up(&(schedule->sync_sem)); - semaphore_down(&(schedule->sync_sem)); + semaphore_down(&(schedule->push_sem)); break; default: return FALSE; @@ -197,6 +195,15 @@ __schedule_pushed_handling(MESSENGER_Schedule *schedule, } static void +__schedule_exit_handling(MESSENGER_Schedule *schedule, + MESSENGER_ScheduleSignal val) +{ + g_assert(schedule); + + semaphore_up(&(schedule->sync_sem)); +} + +static void __schedule_setup_push_task(MESSENGER_Schedule *schedule); static void @@ -213,7 +220,7 @@ __schedule_pushed_task(void *cls) if (__schedule_pushed_handling(schedule, val)) __schedule_setup_push_task(schedule); - signal_write(&(schedule->sync_signal), val); + __schedule_exit_handling(schedule, val); } static void @@ -265,7 +272,7 @@ __schedule_pushed(gint fd, if (keep) schedule->poll = task; - signal_write(&(schedule->sync_signal), val); + __schedule_exit_handling(schedule, val); return keep; } @@ -295,7 +302,6 @@ schedule_cleanup(MESSENGER_Schedule *schedule) semaphore_destroy(&(schedule->sync_sem)); signal_destroy(&(schedule->push_signal)); - signal_destroy(&(schedule->sync_signal)); memset(schedule, 0, sizeof(MESSENGER_Schedule)); } @@ -316,11 +322,9 @@ schedule_sync_run(MESSENGER_Schedule *schedule, schedule->data = data; const MESSENGER_ScheduleSignal push = MESSENGER_SCHEDULE_SIGNAL_RUN; - MESSENGER_ScheduleSignal sync; signal_write(&(schedule->push_signal), push); - sync = signal_read(&(schedule->sync_signal)); - g_assert(push == sync); + semaphore_down(&(schedule->sync_sem)); } void @@ -334,13 +338,8 @@ schedule_sync_lock(MESSENGER_Schedule *schedule) const MESSENGER_ScheduleSignal push = MESSENGER_SCHEDULE_SIGNAL_LOCK; - semaphore_up(&(schedule->push_sem)); - semaphore_up(&(schedule->sync_sem)); - signal_write(&(schedule->push_signal), push); - - semaphore_up(&(schedule->push_sem)); - semaphore_down(&(schedule->push_sem)); + semaphore_down(&(schedule->sync_sem)); schedule->locked = TRUE; } @@ -354,12 +353,8 @@ schedule_sync_unlock(MESSENGER_Schedule *schedule) (!(schedule->function)) ); - MESSENGER_ScheduleSignal sync; - + semaphore_up(&(schedule->push_sem)); semaphore_down(&(schedule->sync_sem)); - sync = signal_read(&(schedule->sync_signal)); - g_assert(MESSENGER_SCHEDULE_SIGNAL_LOCK == sync); - schedule->locked = FALSE; } diff --git a/src/schedule.h b/src/schedule.h @@ -50,7 +50,6 @@ typedef enum MESSENGER_ScheduleSignal : unsigned char { typedef struct MESSENGER_Schedule { MESSENGER_SignalHandle push_signal; - MESSENGER_SignalHandle sync_signal; MESSENGER_Semaphore push_sem; MESSENGER_Semaphore sync_sem;