Commit 4949a717 authored by Alexandre Julliard's avatar Alexandre Julliard

Moved timeout processing to a separate function.

parent 67c8cb28
...@@ -288,61 +288,67 @@ static void remove_poll_user( struct fd *fd, int user ) ...@@ -288,61 +288,67 @@ static void remove_poll_user( struct fd *fd, int user )
active_users--; active_users--;
} }
/* process pending timeouts and return the time until the next timeout, in milliseconds */
/* server main poll() loop */ static int get_next_timeout(void)
void main_loop(void)
{ {
int ret; if (!list_empty( &timeout_list ))
while (active_users)
{ {
long diff = -1; struct list expired_list, *ptr;
if (!list_empty( &timeout_list )) struct timeval now;
{
struct list expired_list, *ptr;
struct timeval now;
gettimeofday( &now, NULL );
/* first remove all expired timers from the list */ gettimeofday( &now, NULL );
list_init( &expired_list ); /* first remove all expired timers from the list */
while ((ptr = list_head( &timeout_list )) != NULL)
{
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
if (!time_before( &now, &timeout->when )) list_init( &expired_list );
{ while ((ptr = list_head( &timeout_list )) != NULL)
list_remove( &timeout->entry ); {
list_add_tail( &expired_list, &timeout->entry ); struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
}
else break;
}
/* now call the callback for all the removed timers */
while ((ptr = list_head( &expired_list )) != NULL) if (!time_before( &now, &timeout->when ))
{ {
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
list_remove( &timeout->entry ); list_remove( &timeout->entry );
timeout->callback( timeout->private ); list_add_tail( &expired_list, &timeout->entry );
free( timeout );
} }
else break;
}
if (!active_users) break; /* last user removed by a timeout */ /* now call the callback for all the removed timers */
if ((ptr = list_head( &timeout_list )) != NULL) while ((ptr = list_head( &expired_list )) != NULL)
{ {
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry ); struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
diff = (timeout->when.tv_sec - now.tv_sec) * 1000 list_remove( &timeout->entry );
timeout->callback( timeout->private );
free( timeout );
}
if ((ptr = list_head( &timeout_list )) != NULL)
{
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
int diff = (timeout->when.tv_sec - now.tv_sec) * 1000
+ (timeout->when.tv_usec - now.tv_usec) / 1000; + (timeout->when.tv_usec - now.tv_usec) / 1000;
if (diff < 0) diff = 0; if (diff < 0) diff = 0;
} return diff;
} }
}
return -1; /* no pending timeouts */
}
/* server main poll() loop */
void main_loop(void)
{
int i, ret, timeout;
while (active_users)
{
timeout = get_next_timeout();
if (!active_users) break; /* last user removed by a timeout */
ret = poll( pollfd, nb_users, diff ); ret = poll( pollfd, nb_users, timeout );
if (ret > 0) if (ret > 0)
{ {
int i;
for (i = 0; i < nb_users; i++) for (i = 0; i < nb_users; i++)
{ {
if (pollfd[i].revents) if (pollfd[i].revents)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment