剑客
关注科技互联网

民意测验对 mac 10.12 是破碎

在 Mac OS X 首次推出时他们这样没有现有的轮询功能。他们稍后添加 poll() 在 Mac OS X 10.3,但我们很快发现它被打破 (它返回一个非零值时要等待什么) 所以在 thecurl 项目添加一个检查,我们在为此配置和随后避免使用 poll() 在所有 OS X 版本,包括 Mac OS 10.8 (达尔文 12)。相反,代码将切换到基于次 select () 为这些平台的替代解决方案。

版本的 Mac OS X 10.9″小牛”在 2013 年 10 月,苹果已经固定其 poll() 执行,我们已经建立了 libcurl 使用,因为根本没有任何问题。配置脚本挑选正确的底层函数使用。

输入 macOS 10.12 (是的它不叫 OS X 再)”塞拉利昂”,在 2016 年 9 月发布。很快我们发现,poll() 一次反对的行为并非像它应该和我们又回到禁用使用它而不是使用次 select () 的备份解决方案。

新的错误看起来类似的古老问题︰ 当没什么等待和我们问 poll() 等待 N 毫秒,10.12 版本的 poll() 立即返回而不等待。造成忙循环。苹果已经报告的问题,其雷达号码是 28372390。(已经被它们如何计划对此采取行动的任何消息,他们。)

poll() 是由 POSIX 和单一的 Unix 规范,具体说,它定义的︰

如果没有已定义的事件发生了任何选定的文件描述符上,poll() 等待至少一个任何选定的文件描述符上发生的事件的超时毫秒。

我们推这配置检查卷曲,是即将举行的 7.51.0 的一部分发布。我也会做一个小的片段,您可以使用以下独立。

苹果是难以单独在打破调查部。还记得如何 Windows’WSApoll 是坏了吗?

这里是一个小的代码片段,可以检测 10.12 破损︰

#include <poll.h>
#include <stdio.h>
#include <sys/time.h>

int main(void)
{
  struct timeval before, after;
  int rc;
  size_t us;

  gettimeofday(&before, NULL);
  rc = poll(NULL, 0, 500);
  gettimeofday(&after, NULL);

  us = (after.tv_sec - before.tv_sec) * 1000000 +
    (after.tv_usec - before.tv_usec);

  if(us < 400000) {
    puts("poll() is broken");
    return 1;
  }
  else {
    puts("poll() works");
  }
  return 0;
}

[剑客-翻译]

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址