PostgreSQL中WaitEventSet的超时如何实现
WaitEventSet的等待超时如何实现?我们了解到,它和epoll有关,首先先了解下epoll_wait这个函数:
代码语言:javascript复制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等待,直到超时