PostgreSQL中WaitEventSet的超时如何实现

2023-08-09 15:14:43 浏览数 (3)

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
代码语言:javascript复制
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等待,直到超时

0 人点赞