X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2Fasio.c;h=228d10bf9f8fccab817c4e4468711f236657b801;hb=348ef39c1cf89a38a24ebbd221a9b0a3078cfc1c;hp=1102352ef3c05e9fe87de30faacfdde8d6b7027a;hpb=7347d85735bece59aeed0ee60da4f3087ced6abc;p=libucw.git diff --git a/lib/asio.c b/lib/asio.c index 1102352e..228d10bf 100644 --- a/lib/asio.c +++ b/lib/asio.c @@ -18,9 +18,16 @@ static uns asio_num_users; static struct worker_pool asio_wpool; +static pthread_mutex_t asio_init_lock; + +static void CONSTRUCTOR +asio_global_init(void) +{ + pthread_mutex_init(&asio_init_lock, NULL); +} static void -asio_init(void) +asio_init_unlocked(void) { if (asio_num_users++) return; @@ -32,7 +39,7 @@ asio_init(void) } static void -asio_cleanup(void) +asio_cleanup_unlocked(void) { if (--asio_num_users) return; @@ -44,13 +51,16 @@ asio_cleanup(void) void asio_init_queue(struct asio_queue *q) { - asio_init(); + pthread_mutex_lock(&asio_init_lock); + asio_init_unlocked(); + pthread_mutex_unlock(&asio_init_lock); DBG("ASIO: New queue %p", q); ASSERT(q->buffer_size); q->allocated_requests = 0; q->running_requests = 0; q->running_writebacks = 0; + q->use_count = 0; clist_init(&q->idle_list); clist_init(&q->done_list); work_queue_init(&asio_wpool, &q->queue); @@ -74,7 +84,10 @@ asio_cleanup_queue(struct asio_queue *q) } work_queue_cleanup(&q->queue); - asio_cleanup(); + + pthread_mutex_lock(&asio_init_lock); + asio_cleanup_unlocked(); + pthread_mutex_unlock(&asio_init_lock); } struct asio_request *