Avoid locking, list and complicated stuff and use TLS. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/spice_timer_queue.c | 63 ++++++---------------------------------------- 1 file changed, 8 insertions(+), 55 deletions(-) diff --git a/server/spice_timer_queue.c b/server/spice_timer_queue.c index 60017cc..abab878 100644 --- a/server/spice_timer_queue.c +++ b/server/spice_timer_queue.c @@ -21,15 +21,6 @@ #include "spice_timer_queue.h" #include "common/ring.h" -static Ring timer_queue_list; -static int queue_count = 0; -static pthread_mutex_t queue_list_lock = PTHREAD_MUTEX_INITIALIZER; - -static void spice_timer_queue_init(void) -{ - ring_init(&timer_queue_list); -} - struct SpiceTimer { RingItem link; RingItem active_link; @@ -45,48 +36,18 @@ struct SpiceTimer { }; struct SpiceTimerQueue { - RingItem link; pthread_t thread; Ring timers; Ring active_timers; }; -static SpiceTimerQueue *spice_timer_queue_find(void) -{ - pthread_t self = pthread_self(); - RingItem *queue_item; - - RING_FOREACH(queue_item, &timer_queue_list) { - SpiceTimerQueue *queue = SPICE_CONTAINEROF(queue_item, SpiceTimerQueue, link); - - if (pthread_equal(self, queue->thread) != 0) { - return queue; - } - } - - return NULL; -} - -static SpiceTimerQueue *spice_timer_queue_find_with_lock(void) -{ - SpiceTimerQueue *queue; - - pthread_mutex_lock(&queue_list_lock); - queue = spice_timer_queue_find(); - pthread_mutex_unlock(&queue_list_lock); - return queue; -} +static __thread SpiceTimerQueue *current_queue = NULL; int spice_timer_queue_create(void) { SpiceTimerQueue *queue; - pthread_mutex_lock(&queue_list_lock); - if (queue_count == 0) { - spice_timer_queue_init(); - } - - if (spice_timer_queue_find() != NULL) { + if (current_queue != NULL) { spice_printerr("timer queue was already created for the thread"); return FALSE; } @@ -96,10 +57,7 @@ int spice_timer_queue_create(void) ring_init(&queue->timers); ring_init(&queue->active_timers); - ring_add(&timer_queue_list, &queue->link); - queue_count++; - - pthread_mutex_unlock(&queue_list_lock); + current_queue = queue; return TRUE; } @@ -107,10 +65,9 @@ int spice_timer_queue_create(void) void spice_timer_queue_destroy(void) { RingItem *item; - SpiceTimerQueue *queue; + SpiceTimerQueue *queue = current_queue; - pthread_mutex_lock(&queue_list_lock); - queue = spice_timer_queue_find(); + current_queue = NULL; spice_assert(queue != NULL); @@ -121,17 +78,13 @@ void spice_timer_queue_destroy(void) spice_timer_remove(timer); } - ring_remove(&queue->link); free(queue); - queue_count--; - - pthread_mutex_unlock(&queue_list_lock); } SpiceTimer *spice_timer_queue_add(SpiceTimerFunc func, void *opaque) { SpiceTimer *timer = spice_new0(SpiceTimer, 1); - SpiceTimerQueue *queue = spice_timer_queue_find_with_lock(); + SpiceTimerQueue *queue = current_queue; spice_assert(queue != NULL); @@ -221,7 +174,7 @@ unsigned int spice_timer_queue_get_timeout_ms(void) int64_t now_ms; RingItem *head; SpiceTimer *head_timer; - SpiceTimerQueue *queue = spice_timer_queue_find_with_lock(); + SpiceTimerQueue *queue = current_queue; spice_assert(queue != NULL); @@ -244,7 +197,7 @@ void spice_timer_queue_cb(void) struct timespec now; uint64_t now_ms; RingItem *head; - SpiceTimerQueue *queue = spice_timer_queue_find_with_lock(); + SpiceTimerQueue *queue = current_queue; spice_assert(queue != NULL); -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel