static unsigned fd_set_popcount(fd_set *set, unsigned n) { unsigned count = 0, i; for (i = 0; i < __FDELT(n); i++) if (set->fds_bits[i]) count += hweight_long(set->fds_bits[i]); if (i < __FDSET_LONGS && (set->fds_bits[i] & (__FDMASK(n) - 1))) count += hweight_long(set->fds_bits[i] & (__FDMASK(n) - 1)); return count; }
static void fd_set_zerofill(fd_set *set, unsigned n) { unsigned i; i = __FDELT(n); if (i < __FDSET_LONGS) set->fds_bits[i] &= (__FDMASK(n) - 1); for(i++; i < __FDSET_LONGS; i++) set->fds_bits[i] = 0; }
static unsigned fd_set_and(fd_set *result, fd_set *first, fd_set *second, unsigned n) { unsigned i, not_empty = 0; for (i = 0; i < __FDELT(n); i++) if((result->fds_bits[i] = first->fds_bits[i] & second->fds_bits[i])) not_empty = 1; if (i < __FDSET_LONGS && (result->fds_bits[i] = first->fds_bits[i] & second->fds_bits[i] & (__FDMASK(n) - 1))) not_empty = 1; return not_empty; }
int SelectorAddHandler( Selector* self, Handler* handler) { if (self->nhandlers == MAX_HANDLERS) return -1; #if defined(CHECK_DUPLICATE_ADDS) if (_FindHandler(self, handler) != (size_t)-1) return -1; #endif #if defined(USE_FDSET_INTERNALS) handler->__fdelt = __FDELT(handler->sock); handler->__fdmask = __FDMASK(handler->sock); #endif self->handlers[self->nhandlers++] = handler; DEBUG_ASSERT(_FindHandler(self, handler) != (size_t)-1); return 0; }