Hi 2011/5/4 Eric Wong <normalperson / yhbt.net>: > KOSAKI Motohiro <kosaki.motohiro / gmail.com> wrote: >> diff --git a/ext/-test-/wait_for_single_fd/wait_for_single_fd.c >> b/ext/-test-/wait_for_single_fd/wait_for_single_fd.c >> index d406724..6efd1af 100644 >> --- a/ext/-test-/wait_for_single_fd/wait_for_single_fd.c >> +++ b/ext/-test-/wait_for_single_fd/wait_for_single_fd.c >> @@ -25,6 +25,7 @@ Init_wait_for_single_fd(void) >> ¨Ââßäåæéîåßãïîóô¨òâßãÏâêåãô¬ ¢ÒÂß×ÁÉÔÆÄßÉ΢ÉÎÔ²ÎÕͨÒÂß×ÁÉÔÆÄßÉΩ©>> ¨Ââßäåæéîåßãïîóô¨òâßãÏâêåãô¬ ¢ÒÂß×ÁÉÔÆÄßÏÕÔ¢¬ ÉÎÔ²ÎÕͨÒÂß×ÁÉÔÆÄßÏÕÔ©©» >> ¨Ââßäåæéîåßãïîóô¨òâßãÏâêåãô¬ ¢ÒÂß×ÁÉÔÆÄßÐÒÉ¢¬ ÉÎÔ²ÎÕͨÒÂß×ÁÉÔÆÄßÐÒÉ©©» >> + ¨Ââßäåæéîåßãïîóô¨òâßãÏâêåãô¬ ¢ÉÎÔßÍÁØ¢¬ ÉÎÔ²ÎÕͨÉÎÔßÍÁØ©©» >> ¨Ââßäåæéîåßóéîçìåôïîßíåôèïä¨òâßãÉÏ¢÷áéôßæïòßóéîçìåßæä¢>> wait_for_single_fd, 3); >> >> Strongly disagree. Any language change should be passed matz review. > > Huh? ¨Âøô¯ôåóô¯éó ïîìù ìïáäåä äõòéîç ôåóôáîîåöåéîóôáììåä® > No users see anything in ext/-test-/* Oops, my bad. I misunderstood your diff. ok, I'll commit it. > >> 1) use ppoll(2) if available. and use INT_MAX if unavailable. or >> 2) fallback select(2) >> >> 1) is safe because linux has ppol(2). > > OK, good point about ppoll(), I forgot that exists. ¨Â§ì÷ïòë ïî ôèáô > later or tomorrow. ok. > >> ¨Â¨òåóõì°© >> - /* remain compatible with select(2)-based implementation */ >> + /* >> + Remain compatible with the select(2)-based implementation: >> + 1) mask out poll()-only revents such as POLLHUP/POLLERR >> + 2) In case revents only consists of masked-out events, return all >> + ¨Âåñõåóôåä åöåîôó éî ôèòåóõìô áîæïòãôèãáììåò ôï íáëå áî >> + ¨Âøôòá óùóãáì¨å®çòåáä¯÷òéôå¯óåîä¯òåãöôï çåôèåòòïò® >> + / >> result = (int)(fds.revents & fds.events); >> return result == 0 ? events : result; >> ¨Â >> >> I don't understand this. Why does this behavior help to compatible? >> When do we use it? > > We need to ensure rb_wait_for_single_fd(fd, events, timeval) returns > only a subset of its +events+ argument because that's all select() is > capable of. Yes. > > If poll() returns POLLHUP/POLLERR, we should not expose those flags to > callers of rb_wait_for_single_fd() since it would then behave > differently if poll() or select() were used. > > ¨Âîô åöåîôó ÒÂß×ÁÉÔÆÄßÉÎ ÒÂß×ÁÉÔÆÄßÏÕÔ» > ¨Âîô òåöåîôòâß÷áéôßæïòßóéîçìå߿䍿äåöåîôóÎÕÌÌ©» > * poll() itself may return POLLERR, but we prevent it from being in > * revents since select() can't return that */ > ¨Â¨òåöåîôó ÒÂß×ÁÉÔÆÄßÉÎ> * since we don't know POLLERR, we fall back to fail here */ > ¨Â¨òåá䍿䮮®© °© > ¨Ââßóùóßæáé쨰©» > ¨Â > ¨Â¨òåöåîôó ÒÂß×ÁÉÔÆÄßÏÕÔ© > * since we don't know POLLERR, we fall back to fail here */ > ¨Â¨÷òéôå¨æä¬ ®®®© °© > ¨Ââßóùóßæáé쨰©» > ¨Â > * user code shouldn't care about anything else since it only > * requested RB_WAITFD_IN|RB_WAITFD_OUT */ Then, correct way is /* copyed from linux */ #define POLLIN_SET (POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP | POLLERR) #define POLLOUT_SET (POLLWRBAND | POLLWRNORM | POLLOUT | POLLERR) #define POLLEX_SET (POLLPRI) int revent_filter(int revents) { int ret = 0; if (revents & POLLIN_SET) ret |= RB_WAITFD_IN; if (revents & POLLOUT_SET) ret |= RB_WAITFD_OUT; if (revents & POLLEX_SET) ret |= RB_WAITFD_PRI; } this code don't make false positive. I'll commit it.