X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fasio.c;h=e33e03eb13617b43e1b7986f9e03d038740e6d46;hb=018c2e8cf2974edc7755bdf0f4d58637b6bdf184;hp=ab024bedc218c39894d19d8d3717bce53b9db960;hpb=88272ecb5fbee5629d9674f02e4e8645601e340d;p=libucw.git diff --git a/lib/asio.c b/lib/asio.c index ab024bed..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 * @@ -99,6 +104,7 @@ asio_get(struct asio_queue *q) r->len = 0; r->status = -1; r->returned_errno = -1; + r->submitted = 0; return r; } @@ -108,6 +114,7 @@ asio_raw_wait(struct asio_queue *q) struct asio_request *r = (struct asio_request *) work_wait(&q->queue); if (!r) return 0; + r->submitted = 0; q->running_requests--; if (r->op == ASIO_WRITE_BACK) { @@ -154,6 +161,7 @@ asio_submit(struct asio_request *r) struct asio_queue *q = r->queue; DBG("ASIO: Submitting %p on queue %p", r, q); ASSERT(r->op != ASIO_FREE); + ASSERT(!r->submitted); if (r->op == ASIO_WRITE_BACK) { while (q->running_writebacks >= q->max_writebacks) @@ -165,8 +173,9 @@ asio_submit(struct asio_request *r) q->running_writebacks++; } 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); } @@ -190,6 +199,7 @@ asio_put(struct asio_request *r) { struct asio_queue *q = r->queue; DBG("ASIO: Put %p", r); + ASSERT(!r->submitted); ASSERT(q->allocated_requests); clist_add_tail(&q->idle_list, &r->work.n); q->allocated_requests--;