Andreas Mohr, le Sun 02 Nov 2008 17:17:12 +0100, a écrit : > The CUPS backend mechanism had issues before already > (STR #2664, http://www.cups.org/str.php?L2664+P0+S-2+C0+I0+E0+M20+Q ): > > ------------------------------------------------------------------------ > r7204 | mike | 2008-01-09 19:59:55 +0100 (Mi, 09 Jan 2008) | 3 lines > > Don't select() on the output side of the device if we have a > side-channel > callback - this causes 100% CPU usage (STR #2664)
Right but here the issue is on the input side: device_fd got to EOF, thus select() returning it and read() on it returning 0. The attached patch at least prevents select from returning, avoiding 100% CPU usage. Samuel
--- backend/runloop.c.orig 2008-11-11 14:38:02.000000000 +0100 +++ backend/runloop.c 2008-11-11 14:44:42.000000000 +0100 @@ -161,6 +161,7 @@ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + int device_input = 1; fprintf(stderr, @@ -210,7 +211,7 @@ FD_ZERO(&input); if (!print_bytes) FD_SET(print_fd, &input); - if (use_bc) + if (use_bc && device_input) FD_SET(device_fd, &input); if (!print_bytes && side_cb) FD_SET(CUPS_SC_FD, &input); @@ -273,6 +274,13 @@ CUPS_LLCAST bc_bytes); cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0); } + else if (bc_bytes == 0) + { + /* + * End of file, stop trying to read from device_fd + */ + device_input = 0; + } } /*