diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-05-05 11:37:43 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-05-05 11:37:43 +0100 |
commit | aedcdfe854c351c7d441487a30d931acabc1ce82 (patch) | |
tree | 286d878204ec8a9d5455634577699d921b86d6b5 | |
parent | 1df88256728426cf64f6a3e5f1a0219d1342e7df (diff) | |
download | rspamd-aedcdfe854c351c7d441487a30d931acabc1ce82.tar.gz rspamd-aedcdfe854c351c7d441487a30d931acabc1ce82.zip |
[Minor] Allow forced termination of the suspended threads
-rw-r--r-- | src/lua/lua_redis.c | 4 | ||||
-rw-r--r-- | src/lua/lua_thread_pool.c | 13 | ||||
-rw-r--r-- | src/lua/lua_thread_pool.h | 4 |
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 } |