前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL中WaitEventSet的超时如何实现

PostgreSQL中WaitEventSet的超时如何实现

作者头像
yzsDBA
发布2023-08-09 15:14:43
1750
发布2023-08-09 15:14:43
举报

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等待,直到超时
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档