gateway: simplify stopping the cleanup timer
[olsrd.git] / lib / tas / src / lua / lstate.h
1
2 /*
3 ** $Id: lstate.h,v 1.109 2003/02/27 11:52:30 roberto Exp $
4 ** Global State
5 ** See Copyright Notice in lua.h
6 */
7
8 #ifndef lstate_h
9 #define lstate_h
10
11 #include "lua.h"
12
13 #include "lobject.h"
14 #include "ltm.h"
15 #include "lzio.h"
16
17
18 /*
19 ** macros for thread synchronization inside Lua core machine:
20 ** all accesses to the global state and to global objects are synchronized.
21 ** Because threads can read the stack of other threads
22 ** (when running garbage collection),
23 ** a thread must also synchronize any write-access to its own stack.
24 ** Unsynchronized accesses are allowed only when reading its own stack,
25 ** or when reading immutable fields from global objects
26 ** (such as string values and udata values).
27 */
28 #ifndef lua_lock
29 #define lua_lock(L)     ((void) 0)
30 #endif
31
32 #ifndef lua_unlock
33 #define lua_unlock(L)   ((void) 0)
34 #endif
35
36
37 #ifndef lua_userstateopen
38 #define lua_userstateopen(l)
39 #endif
40
41
42
43 struct lua_longjmp;                    /* defined in ldo.c */
44
45
46 /* default meta table (both for tables and udata) */
47 #define defaultmeta(L)  (&G(L)->_defaultmeta)
48
49 /* table of globals */
50 #define gt(L)   (&L->_gt)
51
52 /* registry */
53 #define registry(L)     (&G(L)->_registry)
54
55
56 /* extra stack space to handle TM calls and some other extras */
57 #define EXTRA_STACK   5
58
59
60 #define BASIC_CI_SIZE           8
61
62 #define BASIC_STACK_SIZE        (2*LUA_MINSTACK)
63
64
65
66 typedef struct stringtable {
67   GCObject **hash;
68   ls_nstr nuse;                        /* number of elements */
69   int size;
70 } stringtable;
71
72
73 /*
74 ** informations about a call
75 */
76 typedef struct CallInfo {
77   StkId base;                          /* base for called function */
78   StkId top;                           /* top for this function */
79   int state;                           /* bit fields; see below */
80   union {
81     struct {                           /* for Lua functions */
82       const Instruction *savedpc;
83       const Instruction **pc;          /* points to `pc' variable in `luaV_execute' */
84       int tailcalls;                   /* number of tail calls lost under this entry */
85     } l;
86     struct {                           /* for C functions */
87       int dummy;                       /* just to avoid an empty struct */
88     } c;
89   } u;
90 } CallInfo;
91
92
93 /*
94 ** bit fields for `CallInfo.state'
95 */
96 #define CI_C            (1<<0)  /* 1 if function is a C function */
97
98 /* 1 if (Lua) function has an active `luaV_execute' running it */
99 #define CI_HASFRAME     (1<<1)
100
101 /* 1 if Lua function is calling another Lua function (and therefore its
102    `pc' is being used by the other, and therefore CI_SAVEDPC is 1 too) */
103 #define CI_CALLING      (1<<2)
104 #define CI_SAVEDPC      (1<<3)  /* 1 if `savedpc' is updated */
105 #define CI_YIELD        (1<<4)  /* 1 if thread is suspended */
106
107
108 #define ci_func(ci)     (clvalue((ci)->base - 1))
109
110
111 /*
112 ** `global state', shared by all threads of this state
113 */
114 typedef struct global_State {
115   stringtable strt;                    /* hash table for strings */
116   GCObject *rootgc;                    /* list of (almost) all collectable objects */
117   GCObject *rootudata;                 /* (separated) list of all userdata */
118   GCObject *tmudata;                   /* list of userdata to be GC */
119   Mbuffer buff;                        /* temporary buffer for string concatentation */
120   lu_mem GCthreshold;
121   lu_mem nblocks;                      /* number of `bytes' currently allocated */
122   lua_CFunction panic;                 /* to be called in unprotected errors */
123   TObject _registry;
124   TObject _defaultmeta;
125   struct lua_State *mainthread;
126   Node dummynode[1];                   /* common node array for all empty tables */
127   TString *tmname[TM_N];               /* array with tag-method names */
128 } global_State;
129
130
131 /*
132 ** `per thread' state
133 */
134 struct lua_State {
135   CommonHeader;
136   StkId top;                           /* first free slot in the stack */
137   StkId base;                          /* base of current function */
138   global_State *l_G;
139   CallInfo *ci;                        /* call info for current function */
140   StkId stack_last;                    /* last free slot in the stack */
141   StkId stack;                         /* stack base */
142   int stacksize;
143   CallInfo *end_ci;                    /* points after end of ci array */
144   CallInfo *base_ci;                   /* array of CallInfo's */
145   unsigned short size_ci;              /* size of array `base_ci' */
146   unsigned short nCcalls;              /* number of nested C calls */
147   lu_byte hookmask;
148   lu_byte allowhook;
149   lu_byte hookinit;
150   int basehookcount;
151   int hookcount;
152   lua_Hook hook;
153   TObject _gt;                         /* table of globals */
154   GCObject *openupval;                 /* list of open upvalues in this stack */
155   GCObject *gclist;
156   struct lua_longjmp *errorJmp;        /* current error recover point */
157   ptrdiff_t errfunc;                   /* current error handling function (stack index) */
158 };
159
160
161 #define G(L)    (L->l_G)
162
163
164 /*
165 ** Union of all collectable objects
166 */
167 union GCObject {
168   GCheader gch;
169   union TString ts;
170   union Udata u;
171   union Closure cl;
172   struct Table h;
173   struct Proto p;
174   struct UpVal uv;
175   struct lua_State th;                 /* thread */
176 };
177
178
179 /* macros to convert a GCObject into a specific value */
180 #define gcotots(o)      check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts))
181 #define gcotou(o)       check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))
182 #define gcotocl(o)      check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))
183 #define gcotoh(o)       check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))
184 #define gcotop(o)       check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))
185 #define gcotouv(o)      check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))
186 #define ngcotouv(o) \
187         check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv))
188 #define gcototh(o)      check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))
189
190 /* macro to convert any value into a GCObject */
191 #define valtogco(v)     (cast_align(GCObject *, (v)))
192
193
194 lua_State *luaE_newthread(lua_State * L);
195 void luaE_freethread(lua_State * L, lua_State * L1);
196
197 #endif