From: Martin Mares Date: Sat, 9 Dec 2006 18:28:02 +0000 (+0100) Subject: asio: Put a lock around maintenance of use-counts. X-Git-Tag: holmes-import~506^2~13^2~214 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=348ef39c1cf89a38a24ebbd221a9b0a3078cfc1c;hp=7347d85735bece59aeed0ee60da4f3087ced6abc;p=libucw.git asio: Put a lock around maintenance of use-counts. I want to allow threads creating their own asio queues asynchronously. --- 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 *