)]}'
{
  "commit": "5102a8b8965df2640cc698c2480d9bc34d6f3cb3",
  "tree": "89b72bfa6fd419e2049c5e01d8d4166d3f065b44",
  "parents": [
    "e855bd328ae15c3d3f530ad389d1975730bf49db"
  ],
  "author": {
    "name": "Valentin Bartenev",
    "email": "vbart@nginx.com",
    "time": "Fri May 13 17:19:23 2016 +0300"
  },
  "committer": {
    "name": "Valentin Bartenev",
    "email": "vbart@nginx.com",
    "time": "Fri May 13 17:19:23 2016 +0300"
  },
  "message": "Improved EPOLLRDHUP handling.\n\nWhen it\u0027s known that the kernel supports EPOLLRDHUP, there is no need in\nadditional recv() call to get EOF or error when the flag is absent in the\nevent generated by the kernel.  A special runtime test is done at startup\nto detect if EPOLLRDHUP is actually supported by the kernel because\nepoll_ctl() silently ignores unknown flags.\n\nWith this knowledge it\u0027s now possible to drop the \"ready\" flag for partial\nread.  Previously, the \"ready\" flag was kept until the recv() returned EOF\nor error.  In particular, this change allows the lingering close heuristics\n(which relies on the \"ready\" flag state) to actually work on Linux, and not\nwait for more data in most cases.\n\nThe \"available\" flag is now used in the read event with the semantics similar\nto the corresponding counter in kqueue.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "166c4616642e9bad689e6377e1c6c034c569a81e",
      "old_mode": 33188,
      "old_path": "src/event/modules/ngx_epoll_module.c",
      "new_id": "0b23a952f90865e179837d5d78979c810d51d93b",
      "new_mode": 33188,
      "new_path": "src/event/modules/ngx_epoll_module.c"
    },
    {
      "type": "modify",
      "old_id": "ed0682cf1c88efc0125fb5c7b6bee05fac0eece0",
      "old_mode": 33188,
      "old_path": "src/event/ngx_event.h",
      "new_id": "1c7c14873627130028dbc8c3c84dbf480b56d743",
      "new_mode": 33188,
      "new_path": "src/event/ngx_event.h"
    },
    {
      "type": "modify",
      "old_id": "7d6cada4d1a5502a29d28c5cca810af4119c26bc",
      "old_mode": 33188,
      "old_path": "src/http/ngx_http_request.c",
      "new_id": "aa3c398a36946c8773ee31263df9b2cec6d9e80e",
      "new_mode": 33188,
      "new_path": "src/http/ngx_http_request.c"
    },
    {
      "type": "modify",
      "old_id": "5f08e3909d037aecf656288310a38a5a9ac06283",
      "old_mode": 33188,
      "old_path": "src/http/ngx_http_upstream.c",
      "new_id": "89b216061df177155aaf4c8e922b7d2c317c91b4",
      "new_mode": 33188,
      "new_path": "src/http/ngx_http_upstream.c"
    },
    {
      "type": "modify",
      "old_id": "d23508ea7b58b55681a2104bd00496fd8cbc5896",
      "old_mode": 33188,
      "old_path": "src/os/unix/ngx_readv_chain.c",
      "new_id": "454cfdcad44e2c4569c2c639ac711111d73d4700",
      "new_mode": 33188,
      "new_path": "src/os/unix/ngx_readv_chain.c"
    },
    {
      "type": "modify",
      "old_id": "5013ae34ccd822bc4c60cb9500837f0899e9a752",
      "old_mode": 33188,
      "old_path": "src/os/unix/ngx_recv.c",
      "new_id": "c85fd453c91bfffd842f5b73863d453865ebab9c",
      "new_mode": 33188,
      "new_path": "src/os/unix/ngx_recv.c"
    }
  ]
}
