1 | /* |
2 | * This Source Code Form is subject to the terms of the Mozilla Public |
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
5 | * |
6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
7 | */ |
8 | |
9 | /* |
10 | * (c) Martin Kersten |
11 | * MonetDB Basic Definitions |
12 | * Definitions that need to included in every file of the Monet system, as well as in user defined module implementations. |
13 | */ |
14 | #ifndef _MAL_H |
15 | #define _MAL_H |
16 | |
17 | #include "gdk.h" |
18 | |
19 | #ifdef WIN32 |
20 | #if !defined(LIBMAL) && !defined(LIBATOMS) && !defined(LIBKERNEL) && !defined(LIBMAL) && !defined(LIBOPTIMIZER) && !defined(LIBSCHEDULER) && !defined(LIBMONETDB5) |
21 | #define mal_export extern __declspec(dllimport) |
22 | #else |
23 | #define mal_export extern __declspec(dllexport) |
24 | #endif |
25 | #else |
26 | #define mal_export extern |
27 | #endif |
28 | |
29 | #ifdef HAVE_SYS_TIMES_H |
30 | # include <sys/times.h> |
31 | #endif |
32 | |
33 | /* |
34 | * MonetDB Calling Options |
35 | * The number of invocation arguments is kept to a minimum. |
36 | * See `man mserver5` or tools/mserver/mserver5.1 |
37 | * for additional system variable settings. |
38 | */ |
39 | #define MAXSCRIPT 64 |
40 | |
41 | /* The compile time debugging flags are turned into bit masks, akin to GDK */ |
42 | mal_export lng OPTdebug; |
43 | |
44 | #define OPTaliases (1 ) |
45 | #define OPTcandidates ((lng)1 << 1) |
46 | #define OPTcoercion ((lng)1 << 2) |
47 | #define OPTcommonterms ((lng)1 << 3) |
48 | #define OPTconstants ((lng)1 << 4) |
49 | #define OPTcostmodel ((lng)1 << 5) |
50 | #define OPTdataflow ((lng)1 << 6) |
51 | #define OPTdeadcode ((lng)1 << 7) |
52 | #define OPTemptybind ((lng)1 << 8) |
53 | #define OPTevaluate ((lng)1 << 9) |
54 | #define OPTgarbagecollector ((lng)1 << 10) |
55 | #define OPTgenerator ((lng)1 << 11) |
56 | #define OPTinline ((lng)1 << 12) |
57 | #define OPTjit ((lng)1 << 13) |
58 | #define OPTjson ((lng)1 << 14) |
59 | #define OPTmacros ((lng)1 << 15) |
60 | #define OPTmatpack ((lng)1 << 15) |
61 | #define OPTmergetable ((lng)1 << 16) |
62 | #define OPTmitosis ((lng)1 << 17) |
63 | #define OPTmultiplex ((lng)1 << 18) |
64 | #define OPToltp ((lng)1 << 19) |
65 | #define OPTpipes ((lng)1 << 20) |
66 | #define OPTpostfix ((lng)1 << 21) |
67 | #define OPTprelude ((lng)1 << 22) |
68 | #define OPTprofiler ((lng)1 << 23) |
69 | #define OPTprojectionpath ((lng)1 << 24) |
70 | #define OPTpushselect ((lng)1 << 25) |
71 | #define OPTquerylog ((lng)1 << 26) |
72 | #define OPTreduce ((lng)1 << 27) |
73 | #define OPTremap ((lng)1 << 28) |
74 | #define OPTremotequeries ((lng)1 << 29) |
75 | #define OPTreorder ((lng)1 << 30) |
76 | #define OPTsupport ((lng)1 << 31) |
77 | #define OPTvolcano ((lng)1 << 32) |
78 | #define OPTwlc ((lng)1 << 33) |
79 | |
80 | mal_export lng MALdebug; |
81 | |
82 | /* |
83 | * MonetDB assumes it can use most of the machines memory, |
84 | * leaving a small portion for other programs. |
85 | */ |
86 | #define GB (((lng)1024)*1024*1024) |
87 | #define MEMORY_THRESHOLD (0.2 * GDK_mem_maxsize > 8 * GB? GDK_mem_maxsize - 8 * GB: 0.8 * GDK_mem_maxsize) |
88 | |
89 | mal_export char monet_cwd[FILENAME_MAX]; |
90 | mal_export char monet_characteristics[4096]; |
91 | mal_export stream *maleventstream; |
92 | |
93 | #ifdef HAVE_HGE |
94 | mal_export int have_hge; |
95 | #endif |
96 | |
97 | /* |
98 | See gdk/gdk.h for the definition of all debug masks. |
99 | See `man mserver5` or tools/mserver/mserver5.1 |
100 | for a documentation of all debug options. |
101 | */ |
102 | #define GRPthreads (THRDMASK | PARMASK) |
103 | #define GRPmemory (MEMMASK | ALLOCMASK ) |
104 | #define GRPproperties (CHECKMASK | PROPMASK | BATMASK ) |
105 | #define GRPio (IOMASK | PERFMASK ) |
106 | #define GRPheaps (HEAPMASK) |
107 | #define GRPtransactions (TMMASK | DELTAMASK | TEMMASK) |
108 | #define GRPmodules (LOADMASK) |
109 | #define GRPalgorithms (ALGOMASK | ESTIMASK) |
110 | #define GRPperformance (DEADBEEFMASK) |
111 | #define GRPoptimizers (OPTMASK) |
112 | #define GRPforcemito (FORCEMITOMASK | NOSYNCMASK) |
113 | |
114 | mal_export MT_Lock mal_contextLock; |
115 | mal_export MT_Lock mal_remoteLock; |
116 | mal_export MT_Lock mal_profileLock ; |
117 | mal_export MT_Lock mal_copyLock ; |
118 | mal_export MT_Lock mal_delayLock ; |
119 | mal_export MT_Lock mal_oltpLock ; |
120 | |
121 | mal_export int mal_init(void); |
122 | mal_export _Noreturn void mal_exit(int status); |
123 | mal_export void mserver_reset(void); |
124 | |
125 | /* This should be here, but cannot, as "Client" isn't known, yet ... |-( |
126 | * For now, we move the prototype declaration to src/mal/mal_client.c, |
127 | * the only place where it is currently used. Maybe, we should concider |
128 | * also moving the implementation there... |
129 | */ |
130 | |
131 | /* Listing modes are globally known */ |
132 | #define LIST_INPUT 1 /* echo original input */ |
133 | #define LIST_MAL_NAME 2 /* show variable name */ |
134 | #define LIST_MAL_TYPE 4 /* show type resolutoin */ |
135 | #define LIST_MAL_VALUE 8 /* list bat tuple count */ |
136 | #define LIST_MAL_PROPS 16 /* show variable properties */ |
137 | #define LIST_MAL_MAPI 32 /* output Mapi compatible output */ |
138 | #define LIST_MAL_REMOTE 64 /* output MAL for remote execution */ |
139 | #define LIST_MAL_CALL (LIST_MAL_NAME | LIST_MAL_VALUE ) |
140 | #define LIST_MAL_DEBUG (LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_TYPE | LIST_MAL_PROPS) |
141 | #define LIST_MAL_ALL (LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_TYPE | LIST_MAL_PROPS | LIST_MAL_MAPI) |
142 | |
143 | /* type check status is kept around to improve type checking efficiency */ |
144 | #define TYPE_ERROR -1 |
145 | #define TYPE_UNKNOWN 0 |
146 | #define TYPE_RESOLVED 2 |
147 | #define GARBAGECONTROL 3 |
148 | |
149 | #define VARARGS 1 /* deal with variable arguments */ |
150 | #define VARRETS 2 |
151 | |
152 | typedef int malType; |
153 | typedef str (*MALfcn) (); |
154 | |
155 | typedef struct SYMDEF { |
156 | struct SYMDEF *peer; /* where to look next */ |
157 | struct SYMDEF *skip; /* skip to next different symbol */ |
158 | str name; |
159 | int kind; /* what kind of symbol */ |
160 | struct MALBLK *def; /* the details of the MAL fcn */ |
161 | } *Symbol, SymRecord; |
162 | |
163 | typedef struct VARRECORD { |
164 | char id[IDLENGTH]; /* use the space for the full name */ |
165 | malType type; /* internal type signature */ |
166 | bool constant:1, |
167 | typevar:1, |
168 | fixedtype:1, |
169 | udftype:1, |
170 | cleanup:1, |
171 | initialized:1, |
172 | used:1, |
173 | disabled:1; |
174 | short depth; /* scope block depth, set to -1 if not used */ |
175 | short worker; /* thread id of last worker producing it */ |
176 | ValRecord value; |
177 | int declared; /* pc index when it was first assigned */ |
178 | int updated; /* pc index when it was first updated */ |
179 | int eolife; /* pc index when it should be garbage collected */ |
180 | int stc; /* pc index for rendering schema.table.column */ |
181 | BUN rowcnt; /* estimated row count*/ |
182 | } *VarPtr, VarRecord; |
183 | |
184 | /* For performance analysis we keep track of the number of calls and |
185 | * the total time spent while executing the instruction. (See |
186 | * mal_profiler.c) |
187 | */ |
188 | |
189 | typedef struct { |
190 | bte token; /* instruction type */ |
191 | bit barrier; /* flow of control modifier takes: |
192 | BARRIER, LEAVE, REDO, EXIT, CATCH, RAISE */ |
193 | bit typechk; /* type check status */ |
194 | bte gc; /* garbage control flags */ |
195 | bit polymorphic; /* complex type analysis */ |
196 | bit varargs; /* variable number of arguments */ |
197 | int jump; /* controlflow program counter */ |
198 | int pc; /* location in MAL plan for profiler*/ |
199 | MALfcn fcn; /* resolved function address */ |
200 | struct MALBLK *blk; /* resolved MAL function address */ |
201 | int mitosis; /* old mtProp value */ |
202 | /* inline statistics */ |
203 | lng clock; /* when the last call was started */ |
204 | lng ticks; /* total micro seconds spent in last call */ |
205 | int calls; /* number of calls made to this instruction */ |
206 | lng totticks; /* total time spent on this instruction. */ |
207 | lng wbytes; /* number of bytes produced in last instruction */ |
208 | /* the core admin */ |
209 | str modname; /* module context, reference into namespace */ |
210 | str fcnname; /* function name, reference into namespace */ |
211 | int argc, retc, maxarg; /* total and result argument count */ |
212 | int argv[FLEXIBLE_ARRAY_MEMBER]; /* at least a few entries */ |
213 | } *InstrPtr, InstrRecord; |
214 | |
215 | typedef struct MALBLK { |
216 | char binding[IDLENGTH]; /* related C-function */ |
217 | str help; /* supportive commentary */ |
218 | oid tag; /* unique block tag */ |
219 | struct MALBLK *alternative; |
220 | int vtop; /* next free slot */ |
221 | int vsize; /* size of variable arena */ |
222 | int vid; /* generate local variable counter */ |
223 | VarRecord *var; /* Variable table */ |
224 | int stop; /* next free slot */ |
225 | int ssize; /* byte size of arena */ |
226 | InstrPtr *stmt; /* Instruction location */ |
227 | |
228 | bool inlineProp:1, /* inline property */ |
229 | unsafeProp:1, /* unsafe property */ |
230 | sealedProp:1; /* sealed property (opertions for sealed object should be on the full object once) */ |
231 | |
232 | str errors; /* left over errors */ |
233 | struct MALBLK *history; /* of optimizer actions */ |
234 | short keephistory; /* do we need the history at all */ |
235 | int maxarg; /* keep track on the maximal arguments used */ |
236 | ptr replica; /* for the replicator tests */ |
237 | lng starttime; /* track when the query started, for resource management */ |
238 | lng runtime; /* average execution time of block in ticks */ |
239 | int calls; /* number of calls */ |
240 | lng optimize; /* total optimizer time */ |
241 | int activeClients; /* load during mitosis optimization */ |
242 | } *MalBlkPtr, MalBlkRecord; |
243 | |
244 | #define STACKINCR 128 |
245 | #define MAXGLOBALS (4 * STACKINCR) |
246 | |
247 | typedef int (*DFhook) (void *, void *, void *, void *); |
248 | |
249 | typedef struct MALSTK { |
250 | int stksize; |
251 | int stktop; |
252 | int stkbot; /* the first variable to be initialized */ |
253 | int stkdepth; /* to protect against runtime stack overflow */ |
254 | int calldepth; /* to protect against runtime stack overflow */ |
255 | short keepAlive; /* do not garbage collect when set */ |
256 | /* |
257 | * Parallel processing is mostly driven by dataflow, but within this context |
258 | * there may be different schemes to take instructions into execution. |
259 | * The admission scheme (and wrapup) are the necessary scheduler hooks. |
260 | */ |
261 | DFhook admit; |
262 | DFhook wrapup; |
263 | |
264 | /* |
265 | * It is handy to administer the timing in the stack frame |
266 | * for use in profiling instructions. |
267 | */ |
268 | struct timeval clock; /* time this stack was created */ |
269 | char cmd; /* debugger and runtime communication */ |
270 | char status; /* srunning 'R' suspended 'S', quiting 'Q' */ |
271 | int pcup; /* saved pc upon a recursive all */ |
272 | oid tag; /* unique invocation call tag */ |
273 | int workers; /* Actual number of concurrent workers */ |
274 | lng memory; /* Actual memory claim highwater mark */ |
275 | |
276 | struct MALSTK *up; /* stack trace list */ |
277 | struct MALBLK *blk; /* associated definition */ |
278 | ValRecord stk[FLEXIBLE_ARRAY_MEMBER]; |
279 | } MalStack, *MalStkPtr; |
280 | |
281 | #define MAXOLTPLOCKS 1024 |
282 | typedef unsigned char OLTPlocks[MAXOLTPLOCKS]; |
283 | |
284 | #define OLTPclear(X) memset((char*)X, 0, sizeof(X)) |
285 | |
286 | #endif /* _MAL_H*/ |
287 | |