1 | // This file is part of SmallBASIC |
2 | // |
3 | // SmallBASIC SB-Task manager |
4 | // |
5 | // This program is distributed under the terms of the GPL v2.0 or later |
6 | // Download the GNU Public License (GPL) from www.gnu.org |
7 | // |
8 | // Copyright(C) 2000 Nicholas Christopoulos |
9 | |
10 | #if !defined(__sb_tasks_h) |
11 | #define __sb_tasks_h |
12 | |
13 | #include "common/bc.h" |
14 | |
15 | #if defined(__cplusplus) |
16 | extern "C" { |
17 | #endif |
18 | |
19 | typedef enum { |
20 | tsk_free, tsk_ready |
21 | } task_status_t; |
22 | |
23 | typedef struct timer_s timer_s; |
24 | struct timer_s { |
25 | timer_s *next; // next timer |
26 | long value; // time for next event |
27 | long interval; // interval ms |
28 | bcip_t ip; // handler location |
29 | int active; // whether IP is being invoked |
30 | }; |
31 | |
32 | typedef struct { |
33 | bcip_t length; /**< The byte-code length (program length in bytes) */ |
34 | bcip_t ip; /**< Register IP; the instruction pointer */ |
35 | byte *bytecode; /**< The byte-code itself */ |
36 | bcip_t dp; /**< Register DP; READ/DATA current position */ |
37 | bcip_t org; /**< READ/DATA beginning position */ |
38 | stknode_t *stack; /**< The program stack */ |
39 | uint32_t stack_alloc; /**< The stack size */ |
40 | uint32_t sp; /**< Register SP; The stack pointer */ |
41 | var_t *eval_stk; /**< eval's stack */ |
42 | uint16_t eval_stk_size; /**< eval's stack size */ |
43 | uint16_t eval_esp; /**< Register ESP; eval's stack pointer */ |
44 | |
45 | /* |
46 | * Register R; no need |
47 | */ |
48 | /* |
49 | * Register L; no need |
50 | */ |
51 | uint32_t varcount; /**< number of global-variables */ |
52 | uint32_t labcount; /**< number of labels */ |
53 | uint32_t libcount; /**< number of linked libraries */ |
54 | uint32_t symcount; /**< number of linked symbols */ |
55 | uint32_t expcount; /**< number of exported symbols */ |
56 | |
57 | var_t **vartable; /**< The table of variables */ |
58 | lab_t *labtable; /**< The table of labels */ |
59 | bc_lib_rec_t *libtable; /**< import-libraries table */ |
60 | bc_symbol_rec_t *symtable; /**< import-symbols table */ |
61 | unit_sym_t *exptable; /**< export-symbols table */ |
62 | timer_s *timer; /** timer linked list */ |
63 | } task_executor; |
64 | |
65 | typedef struct { |
66 | ext_proc_node_t *extproctable; /**< external procedure table */ |
67 | int extprocsize; /**< ext-proc table allocated size */ |
68 | int extproccount; /**< ext-proc table count */ |
69 | |
70 | ext_func_node_t *extfunctable; /**< external function table */ |
71 | int extfuncsize; /**< ext-func table allocated size */ |
72 | int extfunccount; /**< ext-func table count */ |
73 | |
74 | char file_name[OS_PATHNAME_SIZE + 1]; |
75 | char unit_name[SB_KEYWORD_SIZE + 1]; |
76 | int unit_flag; |
77 | |
78 | bc_lib_rec_table_t libtable; |
79 | bc_symbol_rec_table_t imptable; |
80 | unit_sym_table_t exptable; |
81 | |
82 | int block_level; // block level (FOR-NEXT,IF-FI,etc) |
83 | int block_id; // unique ID for blocks (FOR-NEXT,IF-FI,etc) |
84 | |
85 | bcip_t first_data_ip; |
86 | |
87 | // buffers... needed for devices with limited memory |
88 | char *bc_name; |
89 | char *bc_parm; |
90 | char *bc_temp; // primary all-purpose buffer |
91 | char *bc_tmp2; // secondary all-purpose buffer |
92 | char *bc_proc; |
93 | char *bc_sec; // used by sberr.c |
94 | |
95 | int proc_level; |
96 | // flag - uses global variable-table for the next commands |
97 | byte use_global_vartable; |
98 | |
99 | bc_t bc_prog; |
100 | bc_t bc_data; |
101 | |
102 | char do_close_cmd[64]; |
103 | |
104 | // variable table |
105 | comp_var_t *vartable; |
106 | bid_t varcount; |
107 | bid_t varsize; |
108 | |
109 | // label table |
110 | comp_label_table_t labtable; |
111 | |
112 | // user defined proc/func table |
113 | comp_udp_t *udptable; |
114 | bid_t udpcount; |
115 | bid_t udpsize; |
116 | |
117 | // pass2 stack |
118 | comp_pass_node_table_t stack; |
119 | } task_compiler; |
120 | |
121 | /** |
122 | * @ingroup sys |
123 | * |
124 | * @typedef task_t |
125 | * Task data |
126 | */ |
127 | typedef struct { |
128 | int status; |
129 | int tid; |
130 | int parent; |
131 | |
132 | // common |
133 | int line; /**< The current source code line */ |
134 | int error; /**< The last RTL error code (its work as flag) */ |
135 | char errmsg[SB_ERRMSG_SIZE + 1]; |
136 | char file[OS_PATHNAME_SIZE + 1]; /**< The program file name (task name) */ |
137 | byte *bytecode; /**< BC's memory handle */ |
138 | int bc_type; /**< BC type (1=executable, 2=unit) */ |
139 | int has_sysvars; /**< true if the task has system-variables */ |
140 | |
141 | // compiler/executor |
142 | union { |
143 | task_compiler comp; |
144 | task_executor exec; |
145 | } sbe; |
146 | } task_t; |
147 | |
148 | EXTERN task_t *ctask; /**< current task pointer */ |
149 | |
150 | /** |
151 | * @ingroup sys |
152 | * |
153 | * return the number of the tasks |
154 | * |
155 | * @return the number of the tasks |
156 | */ |
157 | int count_tasks(); |
158 | |
159 | /** |
160 | * @ingroup sys |
161 | * |
162 | * initialize tasks manager |
163 | */ |
164 | int init_tasks(); |
165 | |
166 | /** |
167 | * @ingroup sys |
168 | * |
169 | * destroys tasks and closes task manager |
170 | */ |
171 | void destroy_tasks(); |
172 | |
173 | /** |
174 | * @ingroup sys |
175 | * |
176 | * create an empty new task |
177 | * |
178 | * @param name is the task name |
179 | * @return the task-id |
180 | */ |
181 | int create_task(const char *name); |
182 | |
183 | /** |
184 | * @ingroup sys |
185 | * |
186 | * closes a task and activate the next |
187 | */ |
188 | void close_task(int tid); |
189 | |
190 | /** |
191 | * @ingroup sys |
192 | * |
193 | * set active task |
194 | * |
195 | * @param tid the task-id |
196 | * @return the previous task-id |
197 | */ |
198 | int activate_task(int tid); |
199 | |
200 | /** |
201 | * @ingroup sys |
202 | * |
203 | * return the nth task-structure |
204 | * |
205 | * @return the nth task-structure |
206 | */ |
207 | task_t *taskinfo(int n); |
208 | |
209 | /** |
210 | * @ingroup sys |
211 | * |
212 | * search for a task |
213 | * |
214 | * @param task_name the name of the task |
215 | * @return the task-id; or -1 on error |
216 | */ |
217 | int search_task(const char *task_name); |
218 | |
219 | #if defined(__cplusplus) |
220 | } |
221 | #endif |
222 | #endif |
223 | |