X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libevent%2Fselect.c;h=afba6d3491116df733ca2226c0f3309177143ba6;hp=892ddfaf222aa0541bdc77a02364559e523f1d4c;hb=3a84db87064922ad10ac10cc1d6833380e575995;hpb=2fdd522410f80afcd055d7333f491ee6c0b4b9fa diff --git a/libevent/select.c b/libevent/select.c index 892ddfaf..afba6d34 100644 --- a/libevent/select.c +++ b/libevent/select.c @@ -2,7 +2,7 @@ /* * Copyright 2000-2007 Niels Provos - * Copyright 2007-2010 Niels Provos and Nick Mathewson + * Copyright 2007-2012 Niels Provos and Nick Mathewson * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -50,17 +50,22 @@ #include "log-internal.h" #include "evmap-internal.h" -#ifndef howmany -#define howmany(x, y) (((x)+((y)-1))/(y)) -#endif - #ifndef _EVENT_HAVE_FD_MASK /* This type is mandatory, but Android doesn't define it. */ -#undef NFDBITS -#define NFDBITS (sizeof(long)*8) typedef unsigned long fd_mask; #endif +#ifndef NFDBITS +#define NFDBITS (sizeof(fd_mask)*8) +#endif + +/* Divide positive x by y, rounding up. */ +#define DIV_ROUNDUP(x, y) (((x)+((y)-1))/(y)) + +/* How many bytes to allocate for N fds? */ +#define SELECT_ALLOC_SIZE(n) \ + (DIV_ROUNDUP(n, NFDBITS) * sizeof(fd_mask)) + struct selectop { int event_fds; /* Highest fd in fd set */ int event_fdsz; @@ -100,7 +105,7 @@ select_init(struct event_base *base) if (!(sop = mm_calloc(1, sizeof(struct selectop)))) return (NULL); - if (select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask))) { + if (select_resize(sop, SELECT_ALLOC_SIZE(32 + 1))) { select_free_selectop(sop); return (NULL); } @@ -253,8 +258,7 @@ select_add(struct event_base *base, int fd, short old, short events, void *p) /* In theory we should worry about overflow here. In * reality, though, the highest fd on a unixy system will * not overflow here. XXXX */ - while (fdsz < - (int) (howmany(fd + 1, NFDBITS) * sizeof(fd_mask))) + while (fdsz < (int) SELECT_ALLOC_SIZE(fd + 1)) fdsz *= 2; if (fdsz != sop->event_fdsz) {