lua_yield_thread (struct thread_entry *thread_entry, gint nresults);
/**
- *
- * @param pool
+ * Resumes suspended by lua_yield_thread () thread
+ * @param task
* @param thread_entry
* @param narg
- * @return
*/
void
lua_resume_thread (struct rspamd_task *task, struct thread_entry *thread_entry, gint narg);
-
/* Paths defs */
#define RSPAMD_CONFDIR_INDEX "CONFDIR"
#define RSPAMD_RUNDIR_INDEX "RUNDIR"
}
struct thread_entry *
-lua_thread_pool_get(struct lua_thread_pool *pool)
+lua_thread_pool_get (struct lua_thread_pool *pool)
{
gpointer cur;
struct thread_entry *ent = NULL;
}
void
-lua_thread_pool_return(struct lua_thread_pool *pool, struct thread_entry *thread_entry)
+lua_thread_pool_return (struct lua_thread_pool *pool, struct thread_entry *thread_entry)
{
g_assert (lua_status (thread_entry->lua_state) == 0); /* we can't return a running/yielded thread into the pool */
}
void
-lua_thread_pool_terminate_entry(struct lua_thread_pool *pool, struct thread_entry *thread_entry)
+lua_thread_pool_terminate_entry (struct lua_thread_pool *pool, struct thread_entry *thread_entry)
{
struct thread_entry *ent = NULL;
}
struct thread_entry *
-lua_thread_pool_get_running_entry(struct lua_thread_pool *pool)
+lua_thread_pool_get_running_entry (struct lua_thread_pool *pool)
{
return pool->running_entry;
}
void
-lua_thread_pool_set_running_entry(struct lua_thread_pool *pool, struct thread_entry *thread_entry)
+lua_thread_pool_set_running_entry (struct lua_thread_pool *pool, struct thread_entry *thread_entry)
{
pool->running_entry = thread_entry;
}
+
+
+void
+lua_thread_pool_prepare_callback (struct lua_thread_pool *pool, struct lua_callback_state *cbs)
+{
+ cbs->thread_pool = pool;
+ cbs->previous_thread = lua_thread_pool_get_running_entry (pool);
+ cbs->my_thread = lua_thread_pool_get (pool);
+ cbs->L = cbs->my_thread->lua_state;
+}
+
+void
+lua_thread_pool_restore_callback (struct lua_callback_state *cbs)
+{
+ lua_thread_pool_return (cbs->thread_pool, cbs->my_thread);
+ lua_thread_pool_set_running_entry (cbs->thread_pool, cbs->previous_thread);
+}
struct thread_pool;
+struct lua_callback_state {
+ lua_State *L;
+ struct thread_entry *my_thread;
+ struct thread_entry *previous_thread;
+ struct lua_thread_pool *thread_pool;
+};
+
/**
* Allocates new thread pool on state L. Pre-creates number of lua-threads to use later on
*
* @return
*/
struct thread_entry *
-lua_thread_pool_get_running_entry(struct lua_thread_pool *pool);
+lua_thread_pool_get_running_entry (struct lua_thread_pool *pool);
/**
* Updates currently running thread
* @param thread_entry
*/
void
-lua_thread_pool_set_running_entry(struct lua_thread_pool *pool, struct thread_entry *thread_entry);
+lua_thread_pool_set_running_entry (struct lua_thread_pool *pool, struct thread_entry *thread_entry);
+
+/**
+ * Prevents yielded thread to be used for callback execution. lua_thread_pool_restore_callback() should be called afterwards.
+ *
+ * @param pool
+ * @param cbs
+ */
+void
+lua_thread_pool_prepare_callback (struct lua_thread_pool *pool, struct lua_callback_state *cbs);
+
+/**
+ * Restores state after lua_thread_pool_prepare_callback () usage
+ *
+ * @param cbs
+ */
+void
+lua_thread_pool_restore_callback (struct lua_callback_state *cbs);
#endif /* LUA_THREAD_POOL_H_ */