From a3174fb56f8c6e9e315ddfbd495fb42cde4cca83 Mon Sep 17 00:00:00 2001 From: Nev3r Date: Sun, 21 Apr 2019 16:17:47 +0200 Subject: [PATCH] Add a temporary limbo list for thinkers that need to be freed, in order to keep other lists clean, especially the mobj list. Signed-off-by: Nev3r --- src/p_local.h | 1 + src/p_tick.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/p_local.h b/src/p_local.h index 431f7318f..70a08c0cb 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -62,6 +62,7 @@ #define P_GetPlayerSpinHeight(player) FixedMul(player->spinheight, player->mo->scale) typedef enum{ + THINK_LIMBO, THINK_POLYOBJ, THINK_MAIN, THINK_DYNSLOPE, diff --git a/src/p_tick.c b/src/p_tick.c index 4a71e3cd5..ae1174b15 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -244,10 +244,23 @@ void P_RemoveThinkerDelayed(void *pthinker) // void P_RemoveThinker(thinker_t *thinker) { + thinker_t *next = thinker->next; #ifdef HAVE_BLUA LUA_InvalidateUserdata(thinker); #endif thinker->function.acp1 = P_RemoveThinkerDelayed; + + if (currentthinker == thinker) + currentthinker = thinker->prev; + + // Remove thinker from its current list. + (next->prev = thinker->prev)->next = next; + + // Now add it to the limbo list + thlist[THINK_LIMBO].prev->next = thinker; + thinker->next = &thlist[THINK_LIMBO]; + thinker->prev = thlist[THINK_LIMBO].prev; + thlist[THINK_LIMBO].prev = thinker; } /* @@ -298,7 +311,6 @@ static inline void P_RunThinkers(void) size_t i; for (i = 0; i < NUM_THINKERLISTS; i++) { - CONS_Printf("Running thinker list %d.\n", i); for (currentthinker = thlist[i].next; currentthinker != &thlist[i]; currentthinker = currentthinker->next) { if (currentthinker->function.acp1)