libaio没有协程调度功能,下述代码看到eventfd,协助任务调度,把efd放进yield,并投入epoll。当异步IO完成时,激活epoll,resume。
static int AIO_oper(int fd,char *buff,size_t iosize,int flg)
{
io_context_t myctx;
int rc,num;
uint64_t finished_aio;
struct iocb _iocb,*io=&_iocb;
struct io_event event;
int efd = eventfd(0, 0);
T_YIELD yield=get_yield();
if (efd == -1) {
return flg?write(fd,buff,iosize):read(fd,buff,iosize);
}
memset(&myctx,0,sizeof(myctx));
io_set_eventfd(io,efd);//绑定efd
io_queue_init(1, &myctx);
if(flg) io_prep_pread(io, fd, buff, iosize, 0);
else io_prep_pwrite(io, fd, buff, iosize, 0);
rc = io_submit(myctx, 1, &io);
if(rc<0) {
close(efd);
io_destroy(myctx);
return flg?write(fd,buff,iosize):read(fd,buff,iosize);
}
if(yield) {
rc = yield(efd,0,0);//把eventfd丢给epoll
if(rc==0) eventfd_read(efd, &finished_aio);
}
如果不是协程(没有yield),后边自己等待完成。
【 在 ylh0315 的大作中提到: 】
: 协程调度可以由epoll进行,基于如下特性:
: 1.事件fd直接绑定context,事件响应直接提供context。减少了一个根据fd查找context的过程。
: 2.任何线程可以在任何时候把fd和context投入epoll,并且立即生效,不需要另外的激活操作。
: ...................
--
修改:ylh0315 FROM 221.218.61.*
FROM 221.218.61.*