PostgreSQL中WaitEventSet的超时如何实现WaitEventSet的等待超时如何实现?我们了解到,它和epoll有关,首先先了解下epoll_wait这个函数:
int epoll_wait( int epfd,//epoll_create函数返回的epoll实例的句柄 struct epoll_event * events, //出参。Epoll将发生的事件集合从内核复制到该数组 int maxevents, //本次可以返回的最大事件数目 int timeout//超时时间。-1:阻塞;0:不阻塞;>0:等待超时时间,单位ms );
返回值:0:表示等待超时;>0:返回需要处理的事件数目;-1:出错错误标签:
- EBADF:epfd是一个非法的文件描述符
- EFAULT:事件指向的内存区域无法使用写权限访问
- EINTR:请求的任何事件发生前或者超时到期前,调用被信号处理程序中断
- EINVAL:epdf不是epoll文件描述符,或者maxevents <=0
WaitEventSetWait if (timeout >= 0) {//timeout入参大于等于0,cur_timeout为当前时间 INSTR_TIME_SET_CURRENT(start_time); cur_timeout = timeout; } while (returned_events == 0){ rc = WaitEventSetWaitBlock(set, cur_timeout,occurred_events, nevents); |-- rc = epoll_wait(set->epoll_fd, set->epoll_ret_events,nevents, cur_timeout); | if (rc < 0){ | return 0;//出错 | }else if (rc == 0){ | return -1;//超时 | } | ... |-- return returned_events;//需要处理的事件数 if (rc == -1) break;/* timeout occurred */ else returned_events = rc; if (returned_events == 0 && timeout >= 0) {//epoll_wait出错,并且设置了超时时间 INSTR_TIME_SET_CURRENT(cur_time);//cur_timeout=timeout-(cur_time-start_time) INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) break; } }//如果因出错退出epoll_wait则继续循环下去进行epoll_wait等待,直到超时