Bug #2277
Patch: Fix high CPU usage on Kernel#select
| Status: | Feedback | Start date: | 10/26/2009 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 0% |
||
| Category: | - | |||
| Target version: | - | |||
| ruby -v: | 1.8.6 |
Description
This bug brought my server down two times.
While my patch for p111 it still exist in p287.
diff -ru ruby-1.8.6-p111.orig/io.c ruby-1.8.6-p111/io.c
--- ruby-1.8.6-p111.orig/io.c Tue May 22 23:28:10 2007
+++ ruby-1.8.6-p111/io.c Sun Aug 30 19:08:09 2009
@@ -4802,12 +4802,12 @@
if (!pending && n == 0) return Qnil; /* returns nil on timeout */
res = rb_ary_new2(3);
- rb_ary_push(res, rp?rb_ary_new():rb_ary_new2(0));
+ rb_ary_push(res, (rp||pending)?rb_ary_new():rb_ary_new2(0));
rb_ary_push(res, wp?rb_ary_new():rb_ary_new2(0));
rb_ary_push(res, ep?rb_ary_new():rb_ary_new2(0));
if (interrupt_flag == 0) {
- if (rp) {
+ if (rp || pending) {
list = RARRAY(res)->ptr[0];
for (i=0; i< RARRAY(read)->len; i++) {
GetOpenFile(rb_io_get_io(RARRAY(read)->ptr[i]), fptr);
History
Updated by nobu (Nobuyoshi Nakada) over 2 years ago
Hi, At Mon, 26 Oct 2009 22:55:47 +0900, Zakaria Haris wrote in [ruby-core:26323]: > res = rb_ary_new2(3); > - rb_ary_push(res, rp?rb_ary_new():rb_ary_new2(0)); > + rb_ary_push(res, (rp||pending)?rb_ary_new():rb_ary_new2(0)); Seems curious. When pending is non-zero, rp should be always set. -- Nobu Nakada
Updated by nobu (Nobuyoshi Nakada) over 2 years ago
- Status changed from Open to Feedback
Updated by ujihisa (ujihisa .) over 2 years ago
- Assignee set to nobu (Nobuyoshi Nakada)
Updated by rogerdpack (Roger Pack) about 2 years ago
do you have an example of how to reproduce this?