summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt5
-rw-r--r--src/common/timer.c21
-rw-r--r--src/map/skill.c21
3 files changed, 36 insertions, 11 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 201427743..bf2623489 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,7 +3,10 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
-2008/07/16
+2008/07/20
+ * Simplified the search in pop_timer_heap and added more debug info to help
+ determine the source condition of timer errors. (bugreport:1860)
+ * Fixed crash in skill_castend_id. (bugreport:1860) [FlavioJS]
* Corrected #storagelist target typo (bugreport:1873) [SketchyPhoenix]
2008/07/16
diff --git a/src/common/timer.c b/src/common/timer.c
index 882ddd705..84380c9f9 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -4,6 +4,7 @@
#include "../common/cbasetypes.h"
#include "../common/malloc.h"
#include "../common/showmsg.h"
+#include "../common/db.h"
#include "timer.h"
#include <stdio.h>
@@ -145,6 +146,7 @@ unsigned int gettick(void)
* CORE : Timer Heap
*--------------------------------------*/
+// root at index 0
#define BHEAP_PARENT(pos) ( ((pos) - 1)/2 )
#define BHEAP_LEFT(pos) ( (pos)*2 + 1 )
#define BHEAP_RIGHT(pos) ( (pos)*2 + 2 )
@@ -166,7 +168,7 @@ void push_timer_heap(int tid)
memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int)*256);
}
- // add the timer
+ // add the timer at the end
pos = timer_heap_num++;
timer_heap[pos] = tid;
// restore binary heap properties
@@ -187,6 +189,10 @@ bool pop_timer_heap(int tid)
int pos;
// find the timer
+#if 1
+ // trying a simple array search
+ ARR_FIND(0, timer_heap_num, pos, timer_heap[pos] == tid);
+#else
pos = 0;
while( pos < timer_heap_num )
{// search in the order current-left-right
@@ -220,10 +226,11 @@ bool pop_timer_heap(int tid)
}
pos = right;
}
+#endif
if( pos >= timer_heap_num )
return false;// not found
- // remove timer
+ // remove timer (replace with last one)
timer_heap[pos] = timer_heap[--timer_heap_num];
// restore binary heap properties
while( pos < timer_heap_num )
@@ -231,9 +238,9 @@ bool pop_timer_heap(int tid)
int left = BHEAP_LEFT(pos);
int right = BHEAP_RIGHT(pos);
if( left < timer_heap_num && DIFF_TICK(timer_data[timer_heap[pos]].tick, timer_data[timer_heap[left]].tick) > 0 )
- {
+ {// left exists and has smaller tick
if( right < timer_heap_num && DIFF_TICK(timer_data[timer_heap[left]].tick, timer_data[timer_heap[right]].tick) > 0 )
- {
+ {// right exists and has even smaller tick
swap(timer_heap[pos], timer_heap[right]);
pos = right;
}
@@ -244,7 +251,7 @@ bool pop_timer_heap(int tid)
}
}
else if( right < timer_heap_num && DIFF_TICK(timer_data[timer_heap[pos]].tick, timer_data[timer_heap[right]].tick) > 0 )
- {
+ {// right exists and has smaller tick
swap(timer_heap[pos], timer_heap[right]);
pos = right;
}
@@ -429,6 +436,8 @@ int delete_timer(int tid, TimerFunc func)
timer_data[tid].type = TIMER_FORCE_REMOVE|TIMER_REMOVE_HEAP;
else if( pop_timer_heap(tid) )
release_timer(tid);
+ else if( (timer_data[tid].type|TIMER_REMOVE_HEAP) == 0 )
+ ShowDebug("delete_timer: failed to remove timer %d (%08x(%s), type=%d)\n", tid, (int)func, search_timer_func_list(func), timer_data[tid].type);
return 0;
}
@@ -474,7 +483,7 @@ int do_timer(unsigned int tick)
// process all timers one by one
while( timer_heap_num )
{
- int tid = timer_heap[0]; // first element in heap (=>smallest)
+ int tid = timer_heap[0]; // first element in heap (smallest tick)
diff = DIFF_TICK(timer_data[tid].tick, tick);
if( diff > 0 )
diff --git a/src/map/skill.c b/src/map/skill.c
index cf81ad720..d817e5eba 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -5216,15 +5216,28 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
*------------------------------------------*/
int skill_castend_id(int tid, unsigned int tick, int id, intptr data)
{
- struct block_list *target, *src = map_id2bl(id);
+ struct block_list* target = NULL;
+ struct block_list* src = NULL;
struct map_session_data* sd = NULL;
struct homun_data* hd = NULL; //[orn]
struct mob_data* md = NULL;
- struct unit_data* ud = unit_bl2ud(src);
- struct status_change *sc = NULL;
+ struct unit_data* ud = NULL;
+ struct status_change* sc = NULL;
int inf,inf2,flag=0;
- nullpo_retr(0, ud);
+ src = map_id2bl(id);
+ if( src == NULL )
+ {
+ ShowDebug("skill_castend_id: src == NULL (tid=%d, id=%d)\n", tid, id);
+ return 0;// not found
+ }
+
+ ud = unit_bl2ud(src);
+ if( ud == NULL )
+ {
+ ShowDebug("skill_castend_id: ud == NULL (tid=%d, id=%d)\n", tid, id);
+ return 0;// ???
+ }
sd = BL_CAST(BL_PC, src);
hd = BL_CAST(BL_HOM, src);