blob: b72b72e8d43cc92572ef79aed6605e6f0e3db16c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#ifndef LUA_THREAD_POOL_H_
#define LUA_THREAD_POOL_H_
#include <lua.h>
struct thread_entry {
lua_State *lua_state;
gint thread_index;
gpointer cd;
};
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
*
* @param L
* @return
*/
struct lua_thread_pool *
lua_thread_pool_new (lua_State * L);
/**
* Destroys the pool
* @param pool
*/
void
lua_thread_pool_free (struct lua_thread_pool *pool);
/**
* Extracts a thread from the list of available ones.
* It immediately becames running one and should be used to run a Lua script/function straight away.
* as soon as the code is finished, it should be either returned into list of available threads by
* calling lua_thread_pool_return() or terminated by calling lua_thread_pool_terminate_entry()
* if the code finished with error.
*
* If the code performed YIELD, the thread is still running and it's live should be controlled by the callee
*
* @param pool
* @return
*/
struct thread_entry *
lua_thread_pool_get(struct lua_thread_pool *pool);
/**
* Return thread into the list of available ones. It can't be done with yielded or dead threads.
*
* @param pool
* @param thread_entry
*/
void
lua_thread_pool_return(struct lua_thread_pool *pool, struct thread_entry *thread_entry);
/**
* Removes thread from Lua state. It should be done to dead (which ended with an error) threads only
*
* @param pool
* @param thread_entry
*/
void
lua_thread_pool_terminate_entry(struct lua_thread_pool *pool, struct thread_entry *thread_entry);
/**
* Currently running thread. Typically needed in yielding point - to fill-up continuation.
*
* @param pool
* @return
*/
struct thread_entry *
lua_thread_pool_get_running_entry (struct lua_thread_pool *pool);
/**
* Updates currently running thread
*
* @param pool
* @param thread_entry
*/
void
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_ */
|