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 |
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 } |