src/server/daemon/vfs.c

branch
aio
changeset 187
4384bfbb7e26
parent 185
b4d7ccf4e06d
child 189
a2438f6d1e73
--- a/src/server/daemon/vfs.c	Wed Jan 10 17:25:55 2018 +0100
+++ b/src/server/daemon/vfs.c	Wed Jan 10 18:47:37 2018 +0100
@@ -39,6 +39,7 @@
 #include "../util/pool.h"
 #include "acl.h"
 #include "vfs.h"
+#include "threadpools.h"
 #include "event.h"
 
 #define VFS_MALLOC(pool, size) pool ? pool_malloc(pool, size) : malloc(size)
@@ -61,8 +62,10 @@
     sys_file_write,
     sys_file_seek,
     sys_file_close,
-    sys_file_aioread,
-    sys_file_aiowrite
+    //sys_file_aioread,
+    //sys_file_aiowrite,
+    NULL,
+    NULL
 };
 
 static VFS_DIRIO sys_dir_io = {
@@ -602,8 +605,8 @@
     if(file->io->opt_aioread) {
         return file->io->opt_aioread(aiocb);
     } else {
-        // TODO: implement
-        return -1;
+        vfs_queue_aio(aiocb, VFS_AIO_READ);
+        return 0;
     }
 }
 
@@ -617,7 +620,38 @@
     if(file->io->opt_aiowrite) {
         return file->io->opt_aiowrite(aiocb);
     } else {
-        // TODO: implement
-        return -1;
+        vfs_queue_aio(aiocb, VFS_AIO_WRITE);
+        return 0;
     }
 }
+
+static void* vfs_aio_read(aiocb_s *aiocb) {
+    system_lseek(aiocb->filedes, aiocb->offset, SEEK_SET);
+    int result = system_fread(aiocb->filedes, aiocb->buf, aiocb->nbytes);
+    aiocb->result = result;
+    if(result < 0) {
+        aiocb->result_errno = errno;
+    }
+    event_send(aiocb->evhandler, aiocb->event);
+    return NULL;
+}
+
+static void* vfs_aio_write(aiocb_s *aiocb) {
+    system_lseek(aiocb->filedes, aiocb->offset, SEEK_SET);
+    int result = system_fwrite(aiocb->filedes, aiocb->buf, aiocb->nbytes);
+    aiocb->result = result;
+    if(result < 0) {
+        aiocb->result_errno = errno;
+    }
+    event_send(aiocb->evhandler, aiocb->event);
+    return NULL;
+}
+
+void vfs_queue_aio(aiocb_s *aiocb, VFSAioOp op) {
+    threadpool_t *pool = get_default_threadpool(); // TODO: use IOPool
+    if(op == VFS_AIO_READ) {
+        threadpool_run(pool, (job_callback_f)vfs_aio_read, aiocb);
+    } else if(VFS_AIO_WRITE) {
+        threadpool_run(pool, (job_callback_f)vfs_aio_write, aiocb);
+    }
+}

mercurial