From a2306446c86b3333e69b082e41ae76ba71a42d9d Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Thu, 24 Mar 2011 13:57:13 -0700 Subject: Optimize common objects, and adjust other objects accordingly. Major changes still need to be made to each of the servers. --- src/common/timer.h | 86 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 33 deletions(-) (limited to 'src/common/timer.h') diff --git a/src/common/timer.h b/src/common/timer.h index c6c4b52..4fa5db8 100644 --- a/src/common/timer.h +++ b/src/common/timer.h @@ -1,47 +1,67 @@ -// original : core.h 2003/03/14 11:55:25 Rev 1.4 +#ifndef TIMER_H +#define TIMER_H -#ifndef _TIMER_H_ -#define _TIMER_H_ +# include "sanity.h" -#define BASE_TICK 5 - -#define TIMER_ONCE_AUTODEL 1 -#define TIMER_INTERVAL 2 -#define TIMER_REMOVE_HEAP 16 - -#define DIFF_TICK(a,b) ((int)((a)-(b))) +enum TIMER_TYPE { + TIMER_ONCE_AUTODEL = 1, + TIMER_INTERVAL = 2, +}; +/// This is needed to produce a signed result when 2 ticks are subtracted +# define DIFF_TICK(a,b) ((int32_t)((a)-(b))) -// Struct declaration +// TODO replace with signed 64-bit to make code more clear and protect from the future +typedef uint32_t tick_t; +typedef uint32_t interdb_val_t; +typedef uint32_t timer_id; +// BUG: pointers are stored in here +typedef int32_t custom_id_t; +typedef int32_t custom_data_t; +typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t); struct TimerData { - unsigned int tick; - int (*func) (int, unsigned int, int, int); - int id; - int data; - int type; - int interval; - int heap_pos; + /// When it will be triggered + tick_t tick; + /// What will be done + timer_func func; + /// Arbitrary data. WARNING, callers are stupid and put pointers in here + // Should we change to void* or intptr_t ? + custom_id_t id; + custom_data_t data; + /// Type of timer - 0 initially + enum TIMER_TYPE type; + /// Repeat rate + uint32_t interval; }; -// Function prototype declaration - -unsigned int gettick_nocache (void); -unsigned int gettick (void); +/// Server time, in milliseconds, since the epoch, +/// but use of 32-bit integers means it wraps every 49 days. +// The only external caller of this function is the core.c main loop, but that makes sense +// in fact, it might make more sense if gettick() ALWAYS returned that cached value +tick_t gettick_nocache (void); +/// This function is called enough that it's worth caching the result for +/// the next 255 times +tick_t gettick (void); -int add_timer (unsigned int, int (*)(int, unsigned int, int, int), int, int); -int add_timer_interval (unsigned int, int (*)(int, unsigned int, int, int), - int, int, int); -int delete_timer (int, int (*)(int, unsigned int, int, int)); +timer_id add_timer (tick_t tick, timer_func func, custom_id_t id, + custom_data_t data); +timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id, + custom_data_t data, interdb_val_t interval); +void delete_timer (timer_id, timer_func); -int addtick_timer (int tid, unsigned int tick); -struct TimerData *get_timer (int tid); +tick_t addtick_timer (timer_id tid, interdb_val_t tick); +struct TimerData *get_timer (timer_id tid); -int do_timer (unsigned int tick); +/// Do all timers scheduled before tick, and return the number of milliseconds until the next timer happens +interdb_val_t do_timer (tick_t tick); -int add_timer_func_list (int (*)(int, unsigned int, int, int), char *); -char *search_timer_func_list (int (*)(int, unsigned int, int, int)); +// debugging +static void add_timer_func_list (timer_func, char *) __attribute__((deprecated)); +static inline void add_timer_func_list (timer_func UNUSED, char *UNUSED) {} -extern void timer_final (); +// used to just call free(), which doesn't matter when we're exiting +static void timer_final () __attribute__((deprecated)); +static inline void timer_final() {}; -#endif // _TIMER_H_ +#endif // TIMER_H -- cgit v1.2.3-70-g09d2 From ef740ac0479a5a4f4240db63b84531599a26a983 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Thu, 24 Mar 2011 20:24:47 -0700 Subject: 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 --- src/char/char.c | 1 - src/common/timer.c | 20 ++++++++------------ src/common/timer.h | 19 ++++++------------- src/map/map.c | 1 - src/map/npc.c | 2 ++ 5 files changed, 16 insertions(+), 27 deletions(-) (limited to 'src/common/timer.h') diff --git a/src/char/char.c b/src/char/char.c index d340f1d..dc77c31 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -2337,7 +2337,6 @@ void parse_tologin (int fd) //-------------------------------- // Map-server anti-freeze system //-------------------------------- -typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t); void map_anti_freeze_system (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) { int i; 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; diff --git a/src/common/timer.h b/src/common/timer.h index 4fa5db8..2a38e04 100644 --- a/src/common/timer.h +++ b/src/common/timer.h @@ -3,7 +3,8 @@ # include "sanity.h" -enum TIMER_TYPE { +enum TIMER_TYPE +{ TIMER_ONCE_AUTODEL = 1, TIMER_INTERVAL = 2, }; @@ -32,7 +33,7 @@ struct TimerData /// Type of timer - 0 initially enum TIMER_TYPE type; /// Repeat rate - uint32_t interval; + interdb_val_t interval; }; /// Server time, in milliseconds, since the epoch, @@ -44,24 +45,16 @@ tick_t gettick_nocache (void); /// the next 255 times tick_t gettick (void); -timer_id add_timer (tick_t tick, timer_func func, custom_id_t id, - custom_data_t data); -timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id, - custom_data_t data, interdb_val_t interval); +timer_id add_timer (tick_t, timer_func, custom_id_t, custom_data_t); +timer_id add_timer_interval (tick_t, timer_func, custom_id_t, custom_data_t, interdb_val_t); void delete_timer (timer_id, timer_func); -tick_t addtick_timer (timer_id tid, interdb_val_t tick); +tick_t addtick_timer (timer_id, interdb_val_t); struct TimerData *get_timer (timer_id tid); /// Do all timers scheduled before tick, and return the number of milliseconds until the next timer happens interdb_val_t do_timer (tick_t tick); -// debugging -static void add_timer_func_list (timer_func, char *) __attribute__((deprecated)); -static inline void add_timer_func_list (timer_func UNUSED, char *UNUSED) {} -// used to just call free(), which doesn't matter when we're exiting -static void timer_final () __attribute__((deprecated)); -static inline void timer_final() {}; #endif // TIMER_H diff --git a/src/map/map.c b/src/map/map.c index 8261e49..7730b94 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -2113,7 +2113,6 @@ void do_final (void) delete_session (i); map_removenpc (); - timer_final (); numdb_final (id_db, NULL); strdb_final (map_db, NULL); diff --git a/src/map/npc.c b/src/map/npc.c index 54b13d8..85ac6e9 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -2236,6 +2236,8 @@ int do_final_npc (void) if (ev_db) strdb_final (ev_db, ev_db_final); + if (npcname_db) + strdb_final (npcname_db, NULL); for (i = START_NPC_NUM; i < npc_id; i++) { -- cgit v1.2.3-70-g09d2 From deec3c27f91a97d35aaf912422d1249ec609da05 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Thu, 24 Mar 2011 22:57:06 -0700 Subject: Fix accidentally-named interdb_val_t --- src/common/timer.c | 8 ++++---- src/common/timer.h | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src/common/timer.h') diff --git a/src/common/timer.c b/src/common/timer.c index 915aeb4..f4be19b 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -159,7 +159,7 @@ timer_id add_timer (tick_t tick, timer_func func, custom_id_t id, custom_data_t } timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id, - custom_data_t data, interdb_val_t interval) + custom_data_t data, interval_t interval) { timer_id tid = add_timer (tick, func, id, data); timer_data[tid].type = TIMER_INTERVAL; @@ -185,7 +185,7 @@ void delete_timer (timer_id id, timer_func func) timer_data[id].tick -= 60 * 60 * 1000; } -tick_t addtick_timer (timer_id tid, interdb_val_t tick) +tick_t addtick_timer (timer_id tid, interval_t tick) { return timer_data[tid].tick += tick; } @@ -195,12 +195,12 @@ struct TimerData *get_timer (timer_id tid) return &timer_data[tid]; } -interdb_val_t do_timer (tick_t tick) +interval_t do_timer (tick_t tick) { timer_id i; /// Number of milliseconds until it calls this again // this says to wait 1 sec if all timers get popped - interdb_val_t nextmin = 1000; + interval_t nextmin = 1000; while ((i = top_timer_heap ()) != (timer_id)-1) { diff --git a/src/common/timer.h b/src/common/timer.h index 2a38e04..e363a56 100644 --- a/src/common/timer.h +++ b/src/common/timer.h @@ -13,7 +13,7 @@ enum TIMER_TYPE // TODO replace with signed 64-bit to make code more clear and protect from the future typedef uint32_t tick_t; -typedef uint32_t interdb_val_t; +typedef uint32_t interval_t; typedef uint32_t timer_id; // BUG: pointers are stored in here typedef int32_t custom_id_t; @@ -33,7 +33,7 @@ struct TimerData /// Type of timer - 0 initially enum TIMER_TYPE type; /// Repeat rate - interdb_val_t interval; + interval_t interval; }; /// Server time, in milliseconds, since the epoch, @@ -46,14 +46,14 @@ tick_t gettick_nocache (void); tick_t gettick (void); timer_id add_timer (tick_t, timer_func, custom_id_t, custom_data_t); -timer_id add_timer_interval (tick_t, timer_func, custom_id_t, custom_data_t, interdb_val_t); +timer_id add_timer_interval (tick_t, timer_func, custom_id_t, custom_data_t, interval_t); void delete_timer (timer_id, timer_func); -tick_t addtick_timer (timer_id, interdb_val_t); +tick_t addtick_timer (timer_id, interval_t); struct TimerData *get_timer (timer_id tid); /// Do all timers scheduled before tick, and return the number of milliseconds until the next timer happens -interdb_val_t do_timer (tick_t tick); +interval_t do_timer (tick_t tick); -- cgit v1.2.3-70-g09d2