]> mj.ucw.cz Git - libucw.git/blobdiff - lib/asio.c
Empty final bucket should be turned into a file as well.
[libucw.git] / lib / asio.c
index ab024bedc218c39894d19d8d3717bce53b9db960..f8249515eb82c9f4cdc616396762eaeb83b4fffd 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "lib/lib.h"
 #include "lib/asio.h"
+#include "lib/threads.h"
 
 #include <string.h>
 #include <unistd.h>
@@ -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);
@@ -74,7 +77,10 @@ asio_cleanup_queue(struct asio_queue *q)
     }
 
   work_queue_cleanup(&q->queue);
-  asio_cleanup();
+
+  ucwlib_lock();
+  asio_cleanup_unlocked();
+  ucwlib_unlock();
 }
 
 struct asio_request *
@@ -99,6 +105,7 @@ asio_get(struct asio_queue *q)
   r->len = 0;
   r->status = -1;
   r->returned_errno = -1;
+  r->submitted = 0;
   return r;
 }
 
@@ -108,6 +115,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 +162,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 +174,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 +200,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--;