]> err.no Git - varnish/commitdiff
Added locking on the list manipulation.
authorcecilihf <cecilihf@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 20 Jul 2007 09:19:36 +0000 (09:19 +0000)
committercecilihf <cecilihf@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 20 Jul 2007 09:19:36 +0000 (09:19 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1731 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/heritage.h
varnish-cache/bin/varnishd/stevedore.c

index d70e3589d8690db08f5fa4a603aab41a5a31378c..249224a49dd003ba30558a233e2c19b39d5c910e 100644 (file)
@@ -31,6 +31,7 @@
  * This file contains the heritage passed when mgt forks cache
  */
 
+#include <pthread.h>
 #include "queue.h"
 
 struct listen_sock {
@@ -60,6 +61,7 @@ struct heritage {
 
        /* Storage method */
        struct stevedore_head           stevedore_h;
+       pthread_mutex_t stevedore_lock;
 
        /* Hash method */
        struct hash_slinger             *hash;
index 798787648123b4e6536df5394df3421e563e39bb..9e597b388409e9c0689fc522b202afe1b8834655 100644 (file)
@@ -46,8 +46,8 @@ STV_alloc(size_t size)
        struct stevedore *stv, *stv_first;
        struct stevedore_head *stevedore_h = &heritage.stevedore_h;
 
-       /* Simple round robin selecting of a stevedore.
-        */
+       /* Simple round robin selecting of a stevedore. */
+       pthread_mutex_lock(&heritage.stevedore_lock);
        stv_first = TAILQ_FIRST(stevedore_h);
        stv = stv_first;
        do {
@@ -55,8 +55,10 @@ STV_alloc(size_t size)
                st = stv->alloc(stv, size);
                TAILQ_REMOVE(stevedore_h, stv, stevedore_list);
                TAILQ_INSERT_TAIL(stevedore_h, stv, stevedore_list);
-               if (st != NULL)
+               if (st != NULL) {
+                       pthread_mutex_unlock(&heritage.stevedore_lock);
                        return (st);
+               }
        } while ((stv = TAILQ_FIRST(stevedore_h)) != stv_first);
        
        /* No stevedore with enough space is found. Make room in the first
@@ -65,6 +67,7 @@ STV_alloc(size_t size)
        stv = TAILQ_FIRST(stevedore_h);
        TAILQ_REMOVE(stevedore_h, stv, stevedore_list);
        TAILQ_INSERT_TAIL(stevedore_h, stv, stevedore_list);
+       pthread_mutex_unlock(&heritage.stevedore_lock);
        
        do {
                if ((st = stv->alloc(stv, size)) == NULL)
@@ -143,4 +146,5 @@ STV_open(void)
                if (st->open != NULL)
                        st->open(st);
        }
+       pthread_mutex_init(&heritage.stevedore_lock, NULL);
 }