summaryrefslogtreecommitdiff
path: root/src/common/timer.c
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2011-03-24 20:24:47 -0700
committerBen Longbons <b.r.longbons@gmail.com>2011-03-24 22:43:26 -0700
commitef740ac0479a5a4f4240db63b84531599a26a983 (patch)
treeacd1f7acfbba606beb4565fe4d520e8721a4d18e /src/common/timer.c
parenta2306446c86b3333e69b082e41ae76ba71a42d9d (diff)
downloadtmwa-ef740ac0479a5a4f4240db63b84531599a26a983.tar.gz
tmwa-ef740ac0479a5a4f4240db63b84531599a26a983.tar.bz2
tmwa-ef740ac0479a5a4f4240db63b84531599a26a983.tar.xz
tmwa-ef740ac0479a5a4f4240db63b84531599a26a983.zip
Fix timer bugs in previous version
The most visible effect of this was that the map-server would never actually connect with the char-server
Diffstat (limited to 'src/common/timer.c')
-rw-r--r--src/common/timer.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/src/common/timer.c b/src/common/timer.c
index bf21c8e..915aeb4 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -20,7 +20,7 @@ static uint32_t free_timer_list_max, free_timer_list_pos;
// timer_heap[0] is the size (greatest index into the heap)
// timer_heap[1] is the first actual element
// timer_heap_max increases 256 at a time and never decreases
-static uint32_t timer_heap_max = 256;
+static uint32_t timer_heap_max = 0;
/// FIXME: refactor the code to put the size in a separate variable
//nontrivial because indices get multiplied
static timer_id *timer_heap = NULL;
@@ -48,19 +48,14 @@ uint32_t gettick (void)
static void push_timer_heap (timer_id index)
{
- if (timer_heap == NULL)
+ if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max)
{
timer_heap_max += 256;
- CREATE (timer_heap, timer_id, timer_heap_max);
+ RECREATE (timer_heap, int, timer_heap_max);
+ memset (timer_heap + (timer_heap_max - 256), 0, sizeof (timer_id) * 256);
}
// timer_heap[0] is the greatest index into the heap, which increases
timer_heap[0]++;
- if (timer_heap[0] >= timer_heap_max)
- {
- timer_heap_max += 256;
- RECREATE (timer_heap, timer_id, timer_heap_max);
- memset (timer_heap + (timer_heap_max - 256), 0, 4 * 256);
- }
timer_id h = timer_heap[0]-1, i = (h - 1) / 2;
while (h)
@@ -104,7 +99,8 @@ static timer_id pop_timer_heap ()
uint32_t i = (h - 1) / 2;
while (h)
{
- if (DIFF_TICK(timer_data[timer_heap[i + 1]].tick, timer_data[last].tick) <= 0)
+ if (DIFF_TICK (timer_data[timer_heap[i + 1]].tick, timer_data[last].tick) <= 0)
+ break;
timer_heap[h + 1] = timer_heap[i + 1];
h = i;
i = (h - 1) / 2;
@@ -152,7 +148,7 @@ timer_id add_timer (tick_t tick, timer_func func, custom_id_t id, custom_data_t
}
timer_data[i].tick = tick;
timer_data[i].func = func;
- timer_data[i].id = id;
+ timer_data[i].id = id;
timer_data[i].data = data;
timer_data[i].type = TIMER_ONCE_AUTODEL;
timer_data[i].interval = 1000;
@@ -237,7 +233,7 @@ interdb_val_t do_timer (tick_t tick)
free_timer_list_max += 256;
RECREATE (free_timer_list, uint32_t, free_timer_list_max);
memset (free_timer_list + (free_timer_list_max - 256),
- 0, 256 * sizeof (timer_id));
+ 0, 256 * sizeof (uint32_t));
}
free_timer_list[free_timer_list_pos++] = i;
break;