src/server/daemon/vfs.c

branch
aio
changeset 187
4384bfbb7e26
parent 185
b4d7ccf4e06d
child 189
a2438f6d1e73
equal deleted inserted replaced
186:8041ac363f26 187:4384bfbb7e26
37 #include <ucx/map.h> 37 #include <ucx/map.h>
38 38
39 #include "../util/pool.h" 39 #include "../util/pool.h"
40 #include "acl.h" 40 #include "acl.h"
41 #include "vfs.h" 41 #include "vfs.h"
42 #include "threadpools.h"
42 #include "event.h" 43 #include "event.h"
43 44
44 #define VFS_MALLOC(pool, size) pool ? pool_malloc(pool, size) : malloc(size) 45 #define VFS_MALLOC(pool, size) pool ? pool_malloc(pool, size) : malloc(size)
45 #define VFS_FREE(pool, ptr) pool ? pool_free(pool, ptr) : free(ptr) 46 #define VFS_FREE(pool, ptr) pool ? pool_free(pool, ptr) : free(ptr)
46 47
59 static VFS_IO sys_file_io = { 60 static VFS_IO sys_file_io = {
60 sys_file_read, 61 sys_file_read,
61 sys_file_write, 62 sys_file_write,
62 sys_file_seek, 63 sys_file_seek,
63 sys_file_close, 64 sys_file_close,
64 sys_file_aioread, 65 //sys_file_aioread,
65 sys_file_aiowrite 66 //sys_file_aiowrite,
67 NULL,
68 NULL
66 }; 69 };
67 70
68 static VFS_DIRIO sys_dir_io = { 71 static VFS_DIRIO sys_dir_io = {
69 sys_dir_read, 72 sys_dir_read,
70 sys_dir_close 73 sys_dir_close
600 SYS_FILE file = aiocb->filedes; 603 SYS_FILE file = aiocb->filedes;
601 aiocb->event->object = (intptr_t)aiocb; 604 aiocb->event->object = (intptr_t)aiocb;
602 if(file->io->opt_aioread) { 605 if(file->io->opt_aioread) {
603 return file->io->opt_aioread(aiocb); 606 return file->io->opt_aioread(aiocb);
604 } else { 607 } else {
605 // TODO: implement 608 vfs_queue_aio(aiocb, VFS_AIO_READ);
606 return -1; 609 return 0;
607 } 610 }
608 } 611 }
609 612
610 NSAPI_PUBLIC int system_aio_write(aiocb_s *aiocb) { 613 NSAPI_PUBLIC int system_aio_write(aiocb_s *aiocb) {
611 if(!aiocb->event || !aiocb->evhandler) { 614 if(!aiocb->event || !aiocb->evhandler) {
615 SYS_FILE file = aiocb->filedes; 618 SYS_FILE file = aiocb->filedes;
616 aiocb->event->object = (intptr_t)aiocb; 619 aiocb->event->object = (intptr_t)aiocb;
617 if(file->io->opt_aiowrite) { 620 if(file->io->opt_aiowrite) {
618 return file->io->opt_aiowrite(aiocb); 621 return file->io->opt_aiowrite(aiocb);
619 } else { 622 } else {
620 // TODO: implement 623 vfs_queue_aio(aiocb, VFS_AIO_WRITE);
621 return -1; 624 return 0;
622 } 625 }
623 } 626 }
627
628 static void* vfs_aio_read(aiocb_s *aiocb) {
629 system_lseek(aiocb->filedes, aiocb->offset, SEEK_SET);
630 int result = system_fread(aiocb->filedes, aiocb->buf, aiocb->nbytes);
631 aiocb->result = result;
632 if(result < 0) {
633 aiocb->result_errno = errno;
634 }
635 event_send(aiocb->evhandler, aiocb->event);
636 return NULL;
637 }
638
639 static void* vfs_aio_write(aiocb_s *aiocb) {
640 system_lseek(aiocb->filedes, aiocb->offset, SEEK_SET);
641 int result = system_fwrite(aiocb->filedes, aiocb->buf, aiocb->nbytes);
642 aiocb->result = result;
643 if(result < 0) {
644 aiocb->result_errno = errno;
645 }
646 event_send(aiocb->evhandler, aiocb->event);
647 return NULL;
648 }
649
650 void vfs_queue_aio(aiocb_s *aiocb, VFSAioOp op) {
651 threadpool_t *pool = get_default_threadpool(); // TODO: use IOPool
652 if(op == VFS_AIO_READ) {
653 threadpool_run(pool, (job_callback_f)vfs_aio_read, aiocb);
654 } else if(VFS_AIO_WRITE) {
655 threadpool_run(pool, (job_callback_f)vfs_aio_write, aiocb);
656 }
657 }

mercurial