X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libmainloop%2Fselect.c;h=f8410a5b846c46b318deb3d1a039576c0b0b6618;hb=fe0ecc7af0a51e0482525853c7d62f31fda58a06;hp=28762222b609eb90a0272693577cbb1a95318993;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/libmainloop/select.c b/libmainloop/select.c index 2876222..f8410a5 100644 --- a/libmainloop/select.c +++ b/libmainloop/select.c @@ -1,19 +1,20 @@ /* - * ion/libmainloop/mainloop.c + * libmainloop/select.c * * Partly based on a contributed code. * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ +#include +#include + #include #include #include #include "select.h" +#include "signal.h" /*{{{ File descriptor management */ @@ -97,12 +98,41 @@ void mainloop_select() { fd_set rfds; int nfds=0; - + int ret=0; + FD_ZERO(&rfds); set_input_fds(&rfds, &nfds); - if(select(nfds+1, &rfds, NULL, NULL, NULL)>0) +#ifdef _POSIX_SELECT + { + sigset_t oldmask; + + mainloop_block_signals(&oldmask); + + if(!mainloop_unhandled_signals()) + ret=pselect(nfds+1, &rfds, NULL, NULL, NULL, &oldmask); + + sigprocmask(SIG_SETMASK, &oldmask, NULL); + } +#else + #warning "pselect() unavailable -- using dirty hacks" + { + struct timeval tv_={0, 0}, *tv=&tv_; + + /* If there are timers, make sure we return from select with + * some delay, if the timer signal happens right before + * entering select(). Race conditions with other signals + * we'll just have to ignore without pselect(). + */ + if(!libmainloop_get_timeout(tv)) + tv=NULL; + + if(!mainloop_unhandled_signals()) + ret=select(nfds+1, &rfds, NULL, NULL, tv); + } +#endif + if(ret>0) check_input_fds(&rfds); }