From a3174fb56f8c6e9e315ddfbd495fb42cde4cca83 Mon Sep 17 00:00:00 2001
From: Nev3r <apophycens@gmail.com>
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 <apophycens@gmail.com>
---
 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)