Attempt to address issues with timers overflowing (bug #198)
This commit is contained in:
		
							parent
							
								
									8899e49f73
								
							
						
					
					
						commit
						51a8e785c0
					
				@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * uhub - A tiny ADC p2p connection hub
 | 
			
		||||
 * Copyright (C) 2007-2010, Jan Vidar Krey
 | 
			
		||||
 * Copyright (C) 2007-2013, Jan Vidar Krey
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@ -57,14 +57,30 @@ size_t timeout_queue_process(struct timeout_queue* t, time_t now)
 | 
			
		||||
	size_t pos = (size_t) t->last;
 | 
			
		||||
	size_t events = 0;
 | 
			
		||||
	struct timeout_evt* evt = 0;
 | 
			
		||||
 | 
			
		||||
	uhub_assert(t->last <= now);
 | 
			
		||||
	t->last = now;
 | 
			
		||||
 | 
			
		||||
	// We can optimize in case we need to wrap around
 | 
			
		||||
	// the buffer, so we only do it once
 | 
			
		||||
	if (MAX(pos, now) - MIN(pos, now) > t->max)
 | 
			
		||||
	{
 | 
			
		||||
		// FIXME: Double check this calculation
 | 
			
		||||
		pos = (now - t->max);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (; pos <= now; pos++)
 | 
			
		||||
	{
 | 
			
		||||
		while ((evt = t->events[pos % t->max]))
 | 
			
		||||
		evt = t->events[pos % t->max];
 | 
			
		||||
		while (evt)
 | 
			
		||||
		{
 | 
			
		||||
			timeout_queue_remove(t, evt);
 | 
			
		||||
			evt->callback(evt);
 | 
			
		||||
			events++;
 | 
			
		||||
			if (evt->timestamp < pos)
 | 
			
		||||
			{
 | 
			
		||||
				timeout_queue_remove(t, evt);
 | 
			
		||||
				evt->callback(evt);
 | 
			
		||||
				events++;
 | 
			
		||||
			}
 | 
			
		||||
			evt = evt->next;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return events;
 | 
			
		||||
@ -85,24 +101,22 @@ size_t timeout_queue_get_next_timeout(struct timeout_queue* t, time_t now)
 | 
			
		||||
 | 
			
		||||
void timeout_queue_insert(struct timeout_queue* t, struct timeout_evt* evt, size_t seconds)
 | 
			
		||||
{
 | 
			
		||||
	struct timeout_evt* first;
 | 
			
		||||
	struct timeout_evt* it, *first;
 | 
			
		||||
	size_t pos = ((t->last + seconds) % t->max);
 | 
			
		||||
	evt->timestamp = t->last + seconds;
 | 
			
		||||
	evt->next = 0;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	first = t->events[pos];
 | 
			
		||||
	
 | 
			
		||||
	if (first)
 | 
			
		||||
	{
 | 
			
		||||
		uhub_assert(first->timestamp == evt->timestamp);
 | 
			
		||||
		first->prev->next = evt;
 | 
			
		||||
		evt->prev = first->prev;
 | 
			
		||||
		first->prev = evt;
 | 
			
		||||
		for (it = first; it->next; it = it->next) { }
 | 
			
		||||
		it->next = evt;
 | 
			
		||||
		evt->prev = it;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		t->events[pos] = evt;
 | 
			
		||||
		evt->prev = evt;
 | 
			
		||||
		evt->prev = evt; // point to self.
 | 
			
		||||
	}
 | 
			
		||||
	evt->next = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * uhub - A tiny ADC p2p connection hub
 | 
			
		||||
 * Copyright (C) 2007-2010, Jan Vidar Krey
 | 
			
		||||
 * Copyright (C) 2007-2013, Jan Vidar Krey
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user