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 )
active_users--;
}
/* server main poll() loop */
void main_loop(void)
/* process pending timeouts and return the time until the next timeout, in milliseconds */
static int get_next_timeout(void)
{
int ret;
while (active_users)
if (!list_empty( &timeout_list ))
{
long diff = -1;
if (!list_empty( &timeout_list ))
{
struct list expired_list, *ptr;
struct timeval now;
gettimeofday( &now, NULL );
struct list expired_list, *ptr;
struct timeval now;
/* first remove all expired timers from the list */
gettimeofday( &now, NULL );
list_init( &expired_list );
while ((ptr = list_head( &timeout_list )) != NULL)
{
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
/* first remove all expired timers from the list */
if (!time_before( &now, &timeout->when ))
{
list_remove( &timeout->entry );
list_add_tail( &expired_list, &timeout->entry );
}
else break;
}
/* now call the callback for all the removed timers */
list_init( &expired_list );
while ((ptr = list_head( &timeout_list )) != NULL)
{
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
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 );
timeout->callback( timeout->private );
free( timeout );
list_add_tail( &expired_list, &timeout->entry );
}
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)
{
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
diff = (timeout->when.tv_sec - now.tv_sec) * 1000
while ((ptr = list_head( &expired_list )) != NULL)
{
struct timeout_user *timeout = LIST_ENTRY( ptr, struct timeout_user, entry );
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;
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)
{
int i;
for (i = 0; i < nb_users; i++)
{
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