[Spice-devel] [PATCH] timer: use TLS to store and set current timer queue
Frediano Ziglio
fziglio at redhat.com
Thu Dec 10 12:22:36 PST 2015
> Hi
>
> ----- Original Message -----
> > Avoid locking, list and complicated stuff and use TLS.
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
>
> That's all dropped with the GMainLoop patch, is it worth improving this code?
>
> What's the rationale of postponing the loop patch? Too risky? compared to the
> rest of the changes, maybe not imho.
>
Rationale in another thread.
Yes, this patch will die young, I don't think this is a big issue.
Frediano
> > ---
> > 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
> >
More information about the Spice-devel
mailing list