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
{ {
struct connect_s *next;
int conn_state; int conn_state;
int next_free_connect;
httpd_conn *hc; httpd_conn *hc;
time_t active_at; time_t active_at;
Timer *wakeup_timer; Timer *wakeup_timer;
@ -102,25 +102,20 @@ struct connect_s
* Private Data * Private Data
****************************************************************************/ ****************************************************************************/
static httpd_server *hs = NULL; static httpd_server *hs;
static struct connect_s *free_connections;
static struct connect_s *connects; static struct connect_s *connects;
static int num_connects;
static int first_free_connect;
static int httpd_conn_count;
static struct fdwatch_s *fw; static struct fdwatch_s *fw;
/**************************************************************************** /****************************************************************************
* Public Data * Public Data
****************************************************************************/ ****************************************************************************/
int terminate = 0;
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_NET) #if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_NET)
time_t start_time; time_t start_time;
time_t stats_time; time_t stats_time;
long stats_connections; long stats_connections;
off_t stats_bytes; off_t stats_bytes;
int stats_simultaneous;
#endif #endif
/**************************************************************************** /****************************************************************************
@ -169,7 +164,6 @@ static void shut_down(void)
{ {
httpd_destroy_conn(connects[cnum].hc); httpd_destroy_conn(connects[cnum].hc);
free((void *)connects[cnum].hc); free((void *)connects[cnum].hc);
--httpd_conn_count;
connects[cnum].hc = NULL; 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); nvdbg("New connection(s) on listen_fd %d\n", listen_fd);
for (;;) 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 /* Out of connection slots. Run the timers, then the existing
* connections, and maybe we'll free up a slot by the time we get * connections, and maybe we'll free up a slot by the time we get
* back here. * back here.
*/ */
ndbg("too many connections!\n"); ndbg("No free connections\n");
tmr_run(tv); tmr_run(tv);
return -1; 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 */ /* Make the httpd_conn if necessary */
if (!conn->hc) if (!conn->hc)
@ -239,7 +225,6 @@ static int handle_newconnect(struct timeval *tv, int listen_fd)
} }
conn->hc->initialized = 0; conn->hc->initialized = 0;
httpd_conn_count++;
} }
/* Get the connection */ /* 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); 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; client_data.p = conn;
conn->active_at = tv->tv_sec; conn->active_at = tv->tv_sec;
conn->wakeup_timer = NULL; 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) #if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_NET)
++stats_connections; ++stats_connections;
if (num_connects > stats_simultaneous)
{
stats_simultaneous = num_connects;
}
#endif #endif
} }
} }
@ -620,10 +600,11 @@ static void really_clear_connection(struct connect_s *conn, struct timeval *tv)
conn->linger_timer = 0; conn->linger_timer = 0;
} }
conn->conn_state = CNST_FREE; /* Put the connection structure back on the free list */
conn->next_free_connect = first_free_connect;
first_free_connect = conn - connects; /* division by sizeof is implied */ conn->conn_state = CNST_FREE;
num_connects--; conn->next = free_connections;
free_connections = conn;
} }
static void idle(ClientData client_data, struct timeval *nowP) static void idle(ClientData client_data, struct timeval *nowP)
@ -713,15 +694,13 @@ static void thttpd_logstats(long secs)
{ {
if (secs > 0) 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_connections, (float)stats_connections / secs,
stats_simultaneous, (sint64) stats_bytes, (sint64) stats_bytes, (float)stats_bytes / secs);
(float)stats_bytes / secs, httpd_conn_count);
} }
stats_connections = 0; stats_connections = 0;
stats_bytes = 0; stats_bytes = 0;
stats_simultaneous = 0;
} }
#endif #endif
@ -829,7 +808,6 @@ int thttpd_main(int argc, char **argv)
stats_time = ts.tv_sec; stats_time = ts.tv_sec;
stats_connections = 0; stats_connections = 0;
stats_bytes = 0; stats_bytes = 0;
stats_simultaneous = 0;
} }
#endif #endif
@ -844,15 +822,13 @@ int thttpd_main(int argc, char **argv)
for (cnum = 0; cnum < AVAILABLE_FDS; ++cnum) for (cnum = 0; cnum < AVAILABLE_FDS; ++cnum)
{ {
connects[cnum].conn_state = CNST_FREE; connects[cnum].conn_state = CNST_FREE;
connects[cnum].next_free_connect = cnum + 1; connects[cnum].next = &connects[cnum + 1];
connects[cnum].hc = NULL; connects[cnum].hc = NULL;
} }
connects[AVAILABLE_FDS - 1].next_free_connect = -1; /* end of link list */ connects[AVAILABLE_FDS-1].next = NULL; /* End of link list */
first_free_connect = 0; free_connections = connects; /* Beginning of the link list */
num_connects = 0;
httpd_conn_count = 0;
if (hs != NULL) if (hs != NULL)
{ {
@ -866,7 +842,7 @@ int thttpd_main(int argc, char **argv)
nvdbg("Entering the main loop\n"); nvdbg("Entering the main loop\n");
(void)gettimeofday(&tv, NULL); (void)gettimeofday(&tv, NULL);
while ((!terminate) || num_connects > 0) for(;;)
{ {
/* Do the fd watch */ /* Do the fd watch */