Was exitting when no connections

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2029 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2009-09-02 13:38:54 +00:00
parent 2205249a76
commit 6dc1166e58

View File

@ -87,8 +87,8 @@
struct connect_s
{
struct connect_s *next;
int conn_state;
int next_free_connect;
httpd_conn *hc;
time_t active_at;
Timer *wakeup_timer;
@ -102,25 +102,20 @@ struct connect_s
* Private Data
****************************************************************************/
static httpd_server *hs = NULL;
static httpd_server *hs;
static struct connect_s *free_connections;
static struct connect_s *connects;
static int num_connects;
static int first_free_connect;
static int httpd_conn_count;
static struct fdwatch_s *fw;
/****************************************************************************
* Public Data
****************************************************************************/
int terminate = 0;
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_NET)
time_t start_time;
time_t stats_time;
long stats_connections;
off_t stats_bytes;
int stats_simultaneous;
#endif
/****************************************************************************
@ -169,7 +164,6 @@ static void shut_down(void)
{
httpd_destroy_conn(connects[cnum].hc);
free((void *)connects[cnum].hc);
--httpd_conn_count;
connects[cnum].hc = NULL;
}
}
@ -201,32 +195,24 @@ static int handle_newconnect(struct timeval *tv, int listen_fd)
nvdbg("New connection(s) on listen_fd %d\n", listen_fd);
for (;;)
{
/* Is there room in the connection table? */
/* Get the next free connection from the free list */
if (num_connects >= AVAILABLE_FDS)
conn = free_connections;
/* Are there any free connections? */
if (!conn)
{
/* Out of connection slots. Run the timers, then the existing
* connections, and maybe we'll free up a slot by the time we get
* back here.
*/
ndbg("too many connections!\n");
ndbg("No free connections\n");
tmr_run(tv);
return -1;
}
/* Get the first free connection entry off the free list */
#ifdef CONFIG_DEBUG
if (first_free_connect == -1 ||
connects[first_free_connect].conn_state != CNST_FREE)
{
ndbg("the connects free list is messed up\n");
exit(1);
}
#endif
conn = &connects[first_free_connect];
/* Make the httpd_conn if necessary */
if (!conn->hc)
@ -239,7 +225,6 @@ static int handle_newconnect(struct timeval *tv, int listen_fd)
}
conn->hc->initialized = 0;
httpd_conn_count++;
}
/* Get the connection */
@ -264,14 +249,13 @@ static int handle_newconnect(struct timeval *tv, int listen_fd)
}
nvdbg("New connection fd %d\n", conn->hc->conn_fd);
/* Remove the connection entry from the free list */
conn->conn_state = CNST_READING;
conn->conn_state = CNST_READING;
free_connections = conn->next;
conn->next = NULL;
/* Pop it off the free list */
first_free_connect = conn->next_free_connect;
conn->next_free_connect = -1;
num_connects++;
client_data.p = conn;
conn->active_at = tv->tv_sec;
conn->wakeup_timer = NULL;
@ -285,10 +269,6 @@ static int handle_newconnect(struct timeval *tv, int listen_fd)
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_NET)
++stats_connections;
if (num_connects > stats_simultaneous)
{
stats_simultaneous = num_connects;
}
#endif
}
}
@ -620,10 +600,11 @@ static void really_clear_connection(struct connect_s *conn, struct timeval *tv)
conn->linger_timer = 0;
}
conn->conn_state = CNST_FREE;
conn->next_free_connect = first_free_connect;
first_free_connect = conn - connects; /* division by sizeof is implied */
num_connects--;
/* Put the connection structure back on the free list */
conn->conn_state = CNST_FREE;
conn->next = free_connections;
free_connections = conn;
}
static void idle(ClientData client_data, struct timeval *nowP)
@ -713,15 +694,13 @@ static void thttpd_logstats(long secs)
{
if (secs > 0)
{
ndbg("thttpd - %ld connections (%g/sec), %d max simultaneous, %lld bytes (%g/sec), %d httpd_conns allocated\n",
ndbg("thttpd - %ld connections (%g/sec) %lld bytes (%g/sec)\n",
stats_connections, (float)stats_connections / secs,
stats_simultaneous, (sint64) stats_bytes,
(float)stats_bytes / secs, httpd_conn_count);
(sint64) stats_bytes, (float)stats_bytes / secs);
}
stats_connections = 0;
stats_bytes = 0;
stats_simultaneous = 0;
}
#endif
@ -829,7 +808,6 @@ int thttpd_main(int argc, char **argv)
stats_time = ts.tv_sec;
stats_connections = 0;
stats_bytes = 0;
stats_simultaneous = 0;
}
#endif
@ -844,15 +822,13 @@ int thttpd_main(int argc, char **argv)
for (cnum = 0; cnum < AVAILABLE_FDS; ++cnum)
{
connects[cnum].conn_state = CNST_FREE;
connects[cnum].next_free_connect = cnum + 1;
connects[cnum].hc = NULL;
connects[cnum].conn_state = CNST_FREE;
connects[cnum].next = &connects[cnum + 1];
connects[cnum].hc = NULL;
}
connects[AVAILABLE_FDS - 1].next_free_connect = -1; /* end of link list */
first_free_connect = 0;
num_connects = 0;
httpd_conn_count = 0;
connects[AVAILABLE_FDS-1].next = NULL; /* End of link list */
free_connections = connects; /* Beginning of the link list */
if (hs != NULL)
{
@ -866,7 +842,7 @@ int thttpd_main(int argc, char **argv)
nvdbg("Entering the main loop\n");
(void)gettimeofday(&tv, NULL);
while ((!terminate) || num_connects > 0)
for(;;)
{
/* Do the fd watch */