[svn] - rework poll a bit for the MAXCONNECTIONS changes.

This commit is contained in:
nenolod 2007-03-05 10:40:39 -08:00
parent 51b5f3356a
commit ce439f5186
3 changed files with 58 additions and 25 deletions

View File

@ -1,3 +1,13 @@
jilles 2007/03/05 17:52:28 UTC (20070305-3241)
Log:
Our way of using kqueue may cause it to report fds we
don't know about anymore, cope.
Changes: Modified:
+7 -0 trunk/libcharybdis/kqueue.c (File Modified)
jilles 2007/03/05 17:41:40 UTC (20070305-3239) jilles 2007/03/05 17:41:40 UTC (20070305-3239)
Log: Log:
Don't reference freed memory (fde_t) in comm_close(). Don't reference freed memory (fde_t) in comm_close().

View File

@ -1 +1 @@
#define SERNO "20070305-3239" #define SERNO "20070305-3241"

View File

@ -22,7 +22,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA * USA
* *
* $Id: poll.c 3229 2007-03-05 17:23:07Z nenolod $ * $Id: poll.c 3243 2007-03-05 18:40:39Z nenolod $
*/ */
#include "config.h" #include "config.h"
@ -41,8 +41,9 @@
struct _pollfd_list struct _pollfd_list
{ {
struct pollfd pollfds[MAXCONNECTIONS]; struct pollfd *pollfds;
int maxindex; /* highest FD number */ int maxindex; /* highest FD number */
int allocated;
}; };
typedef struct _pollfd_list pollfd_list_t; typedef struct _pollfd_list pollfd_list_t;
@ -51,6 +52,45 @@ pollfd_list_t pollfd_list;
static void poll_update_pollfds(int, short, PF *); static void poll_update_pollfds(int, short, PF *);
static unsigned long last_count = 0; static unsigned long last_count = 0;
static unsigned long empty_count = 0; static unsigned long empty_count = 0;
/*
* init_netio
*
* This is a needed exported function which will be called to initialise
* the network loop code.
*/
void
init_netio(void)
{
int fd;
pollfd_list.pollfds = calloc(sizeof(struct pollfd), MAXCONNECTIONS);
for (fd = 0; fd < MAXCONNECTIONS; fd++)
pollfd_list.pollfds[fd].fd = -1;
pollfd_list.maxindex = 0;
pollfd_list.allocated = MAXCONNECTIONS;
}
static inline void
resize_poll_array(int fd)
{
int i, old_value = pollfd_list.allocated;
if (fd < pollfd_list.allocated)
return;
pollfd_list.allocated += 1024;
pollfd_list.pollfds = MyRealloc(pollfd_list.pollfds, pollfd_list.allocated * sizeof(struct pollfd));
/* because realloced memory can contain junk, we have to zero it out. */
memset(&pollfd_list.pollfds[old_value+1], 0, sizeof(struct pollfd) * 1024);
for (i = old_value + 1; i <= pollfd_list.allocated; i++)
pollfd_list.pollfds[i].fd = -1;
}
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
/* Private functions */ /* Private functions */
@ -62,7 +102,7 @@ static inline int
poll_findslot(void) poll_findslot(void)
{ {
int i; int i;
for (i = 0; i < MAXCONNECTIONS; i++) for (i = 0; i < pollfd_list.allocated; i++)
{ {
if(pollfd_list.pollfds[i].fd == -1) if(pollfd_list.pollfds[i].fd == -1)
{ {
@ -70,6 +110,7 @@ poll_findslot(void)
return i; return i;
} }
} }
s_assert(1 == 0); s_assert(1 == 0);
/* NOTREACHED */ /* NOTREACHED */
return -1; return -1;
@ -84,10 +125,11 @@ poll_update_pollfds(int fd, short event, PF * handler)
fde_t *F = comm_locate_table(fd); fde_t *F = comm_locate_table(fd);
int comm_index; int comm_index;
resize_poll_array(fd);
if(F->comm_index < 0) if(F->comm_index < 0)
{
F->comm_index = poll_findslot(); F->comm_index = poll_findslot();
}
comm_index = F->comm_index; comm_index = F->comm_index;
/* Update the events */ /* Update the events */
@ -126,25 +168,6 @@ poll_update_pollfds(int fd, short event, PF * handler)
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
/* Public functions */ /* Public functions */
/*
* init_netio
*
* This is a needed exported function which will be called to initialise
* the network loop code.
*/
void
init_netio(void)
{
int fd;
for (fd = 0; fd < MAXCONNECTIONS; fd++)
{
pollfd_list.pollfds[fd].fd = -1;
}
pollfd_list.maxindex = 0;
}
/* /*
* comm_setselect * comm_setselect
* *