aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2021-05-05 11:37:43 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2021-05-05 11:37:43 +0100
commitaedcdfe854c351c7d441487a30d931acabc1ce82 (patch)
tree286d878204ec8a9d5455634577699d921b86d6b5
parent1df88256728426cf64f6a3e5f1a0219d1342e7df (diff)
downloadrspamd-aedcdfe854c351c7d441487a30d931acabc1ce82.tar.gz
rspamd-aedcdfe854c351c7d441487a30d931acabc1ce82.zip
[Minor] Allow forced termination of the suspended threads
-rw-r--r--src/lua/lua_redis.c4
-rw-r--r--src/lua/lua_thread_pool.c13
-rw-r--r--src/lua/lua_thread_pool.h4
3 files changed, 13 insertions, 8 deletions
diff --git a/src/lua/lua_redis.c b/src/lua/lua_redis.c
index b624fc43b..057a21c95 100644
--- a/src/lua/lua_redis.c
+++ b/src/lua/lua_redis.c
@@ -685,8 +685,8 @@ lua_redis_callback_sync (redisAsyncContext *ac, gpointer r, gpointer priv)
}
else {
/* We cannot resume the thread as the associated task has gone */
- lua_thread_pool_terminate_entry (ud->cfg->lua_thread_pool,
- ctx->thread);
+ lua_thread_pool_terminate_entry_full (ud->cfg->lua_thread_pool,
+ ctx->thread, G_STRLOC, true);
ctx->thread = NULL;
}
}
diff --git a/src/lua/lua_thread_pool.c b/src/lua/lua_thread_pool.c
index 01c55b4a9..50c53698c 100644
--- a/src/lua/lua_thread_pool.c
+++ b/src/lua/lua_thread_pool.c
@@ -159,12 +159,17 @@ lua_thread_pool_return_full (struct lua_thread_pool *pool,
void
lua_thread_pool_terminate_entry_full (struct lua_thread_pool *pool,
- struct thread_entry *thread_entry, const gchar *loc)
+ struct thread_entry *thread_entry, const gchar *loc,
+ bool enforce)
{
struct thread_entry *ent = NULL;
- /* we should only terminate failed threads */
- g_assert (lua_status (thread_entry->lua_state) != 0 && lua_status (thread_entry->lua_state) != LUA_YIELD);
+
+ if (!enforce) {
+ /* we should only terminate failed threads */
+ g_assert (lua_status(thread_entry->lua_state) != 0 &&
+ lua_status(thread_entry->lua_state) != LUA_YIELD);
+ }
if (pool->running_entry == thread_entry) {
pool->running_entry = NULL;
@@ -327,7 +332,7 @@ lua_resume_thread_internal_full (struct thread_entry *thread_entry,
* Maybe there is a way to recover here.
* For now, just remove faulty thread
*/
- lua_thread_pool_terminate_entry_full (pool, thread_entry, loc);
+ lua_thread_pool_terminate_entry_full (pool, thread_entry, loc, false);
}
}
}
diff --git a/src/lua/lua_thread_pool.h b/src/lua/lua_thread_pool.h
index 66c8b991c..2845d2f67 100644
--- a/src/lua/lua_thread_pool.h
+++ b/src/lua/lua_thread_pool.h
@@ -192,9 +192,9 @@ lua_thread_resume_full (struct thread_entry *thread_entry,
void
lua_thread_pool_terminate_entry_full (struct lua_thread_pool *pool,
struct thread_entry *thread_entry,
- const gchar *loc);
+ const gchar *loc, bool enforce);
#define lua_thread_pool_terminate_entry(pool, thread_entry) \
- lua_thread_pool_terminate_entry_full (pool, thread_entry, G_STRLOC)
+ lua_thread_pool_terminate_entry_full (pool, thread_entry, G_STRLOC, false)
#ifdef __cplusplus
}