X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fasio.c;h=e33e03eb13617b43e1b7986f9e03d038740e6d46;hb=ab3b3f178718c0ae7b5738e987e350537574d2e6;hp=1102352ef3c05e9fe87de30faacfdde8d6b7027a;hpb=bbf663bc884da55385548f4f6787857e36fd3f27;p=libucw.git diff --git a/lib/asio.c b/lib/asio.c index 1102352e..e33e03eb 100644 --- a/lib/asio.c +++ b/lib/asio.c @@ -11,6 +11,7 @@ #include "lib/lib.h" #include "lib/asio.h" +#include "lib/threads.h" #include #include @@ -20,19 +21,18 @@ static uns asio_num_users; static struct worker_pool asio_wpool; static void -asio_init(void) +asio_init_unlocked(void) { if (asio_num_users++) return; DBG("ASIO: INIT"); asio_wpool.num_threads = 1; - asio_wpool.stack_size = 65536; worker_pool_init(&asio_wpool); } static void -asio_cleanup(void) +asio_cleanup_unlocked(void) { if (--asio_num_users) return; @@ -44,13 +44,16 @@ asio_cleanup(void) void asio_init_queue(struct asio_queue *q) { - asio_init(); + ucwlib_lock(); + asio_init_unlocked(); + ucwlib_unlock(); 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); @@ -66,15 +69,17 @@ asio_cleanup_queue(struct asio_queue *q) ASSERT(clist_empty(&q->done_list)); struct asio_request *r; - while (r = clist_head(&q->idle_list)) + while (r = clist_remove_head(&q->idle_list)) { - clist_remove(&r->work.n); big_free(r->buffer, q->buffer_size); xfree(r); } work_queue_cleanup(&q->queue); - asio_cleanup(); + + ucwlib_lock(); + asio_cleanup_unlocked(); + ucwlib_unlock(); } struct asio_request * @@ -170,7 +175,7 @@ asio_submit(struct asio_request *r) q->running_requests++; r->submitted = 1; r->work.go = asio_handler; - r->work.returned = NULL; + r->work.priority = 0; work_submit(&q->queue, &r->work); }