LispBM
eval_cps.h
Go to the documentation of this file.
1 /*
2  Copyright 2018, 2020 - 2025 Joel Svensson svenssonjoel@yahoo.se
3  2025 Rasmus Söderhielm rasmus.soderhielm@gmail.com
4 
5  This program is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
19 #ifndef EVAL_CPS_H_
20 #define EVAL_CPS_H_
21 
22 #include "lbm_types.h"
23 #include "stack.h"
24 #include "lbm_channel.h"
25 #include "lbm_flat_value.h"
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 #define EVAL_CPS_STATE_NONE 0
32 #define EVAL_CPS_STATE_PAUSED 1
33 #define EVAL_CPS_STATE_RUNNING 2
34 #define EVAL_CPS_STATE_KILL 4
35 #define EVAL_CPS_STATE_DEAD 8
36 #define EVAL_CPS_STATE_RESET 16
37 
38 #define EVAL_CPS_DEFAULT_MAILBOX_SIZE 10
39 
40 // Make sure the flags fit in an u28. (do not go beyond 27 flags)
41 #define EVAL_CPS_CONTEXT_FLAG_NOTHING (uint32_t)0x00
42 #define EVAL_CPS_CONTEXT_FLAG_TRAP (uint32_t)0x01
43 #define EVAL_CPS_CONTEXT_FLAG_CONST (uint32_t)0x02
44 #define EVAL_CPS_CONTEXT_FLAG_CONST_SYMBOL_STRINGS (uint32_t)0x04
45 #define EVAL_CPS_CONTEXT_FLAG_INCREMENTAL_READ (uint32_t)0x08
46 #define EVAL_CPS_CONTEXT_FLAG_TRAP_UNROLL_RETURN (uint32_t)0x10
47 #define EVAL_CPS_CONTEXT_READER_FLAGS_MASK (EVAL_CPS_CONTEXT_FLAG_CONST | EVAL_CPS_CONTEXT_FLAG_CONST_SYMBOL_STRINGS | EVAL_CPS_CONTEXT_FLAG_INCREMENTAL_READ)
48 
52 #define LBM_THREAD_STATE_READY (uint32_t)0u
53 #define LBM_THREAD_STATE_BLOCKED (uint32_t)1u
54 #define LBM_THREAD_STATE_TIMEOUT (uint32_t)2u
55 #define LBM_THREAD_STATE_SLEEPING (uint32_t)4u
56 #define LBM_THREAD_STATE_RECV_BL (uint32_t)8u
57 #define LBM_THREAD_STATE_RECV_TO (uint32_t)16u
58 #define LBM_THREAD_STATE_GC_BIT (uint32_t)(1u << 31)
59 
60 #define LBM_IS_STATE_TIMEOUT(X) (X & (LBM_THREAD_STATE_TIMEOUT | LBM_THREAD_STATE_RECV_TO))
61 #define LBM_IS_STATE_WAKE_UP_WAKABLE(X) (X & (LBM_THREAD_STATE_SLEEPING | LBM_IS_STATE_TIMEOUT(X)))
62 #define LBM_IS_STATE_UNBLOCKABLE(X) (X & (LBM_THREAD_STATE_BLOCKED | LBM_THREAD_STATE_TIMEOUT))
63 #define LBM_IS_STATE_RECV(X) (X & (LBM_THREAD_STATE_RECV_BL | LBM_THREAD_STATE_RECV_TO))
64 typedef struct eval_context_s{
68  lbm_value *mailbox; /* Message passing mailbox */
69  uint32_t mailbox_size;
70  uint32_t num_mail; /* Number of messages in mailbox */
71  uint32_t flags;
73  const char *error_reason;
74  bool app_cont;
78  uint32_t state;
79  char *name;
82  /* while reading */
85  /* List structure */
89 
90 typedef enum {
95 
96 typedef struct {
101 } lbm_event_t;
102 
105 
106 extern const fundamental_fun fundamental_table[];
107 
114 typedef void (*ctx_fun)(eval_context_t *, void*, void*);
115 
116 extern int (*lbm_printf_callback)(const char *, ...);
117 
118 /* Common interface */
127 void lbm_add_eval_symbols(void);
128 
129 /* Concurrent interface */
134 bool lbm_eval_init(void);
135 #ifdef LBM_USE_TIME_QUOTA
140 void lbm_set_eval_time_quota(uint32_t quota);
141 #else
146 void lbm_set_eval_step_quota(uint32_t quota);
147 #endif
152 bool lbm_eval_init_events(unsigned int num_events);
164 bool lbm_event_handler_exists(void);
181 bool lbm_event(lbm_flat_value_t *fv);
186 bool lbm_event_unboxed(lbm_value unboxed);
190 bool lbm_event_queue_is_empty(void);
199 
203 void lbm_run_eval(void);
210 void lbm_reset_eval(void);
215 void lbm_pause_eval(void);
220 void lbm_pause_eval_with_gc(uint32_t num_free);
224 void lbm_continue_eval(void);
228 void lbm_kill_eval(void);
233 uint32_t lbm_get_eval_state(void);
244 void lbm_set_error_reason(const char *error_str);
249 void lbm_set_error_suspect(lbm_value suspect);
253 void lbm_critical_error(void);
255 void lbm_set_critical_error_callback(void (*fptr)(void));
264 lbm_cid lbm_create_ctx(lbm_value program, lbm_value env, lbm_uint stack_size, char *name);
287 bool lbm_unblock_ctx_r(lbm_cid cid);
295 bool lbm_unblock_ctx_unboxed(lbm_cid cid, lbm_value unboxed);
303 void lbm_all_ctxs_iterator(ctx_fun f, void *arg1, void *arg2);
310 void lbm_running_iterator(ctx_fun f, void*, void*);
317 void lbm_blocked_iterator(ctx_fun f, void*, void*);
320 void lbm_toggle_verbose(void);
325 void lbm_set_verbose(bool verbose);
329 void lbm_set_hide_trapped_error(bool hide);
334 void lbm_set_usleep_callback(void (*fptr)(uint32_t));
339 void lbm_set_timestamp_us_callback(uint32_t (*fptr)(void));
345 void lbm_set_ctx_done_callback(void (*fptr)(eval_context_t *));
351 void lbm_set_printf_callback(int (*prnt)(const char*, ...));
355 void lbm_set_dynamic_load_callback(bool (*fptr)(const char *, const char **));
361 
370 void lbm_surrender_quota(void);
376 bool lbm_mailbox_change_size(eval_context_t *ctx, lbm_uint new_size);
377 
379  //bool lift_array_flash(lbm_value flash_cell, char *data, lbm_uint num_elt);
380 
394 int lbm_perform_gc(void);
398 void lbm_request_gc(void);
399 #ifdef __cplusplus
400 }
401 #endif
402 #endif
lbm_event_type_t
Definition: eval_cps.h:90
@ LBM_EVENT_DEFINE
Definition: eval_cps.h:93
@ LBM_EVENT_FOR_HANDLER
Definition: eval_cps.h:91
@ LBM_EVENT_UNBLOCK_CTX
Definition: eval_cps.h:92
void lbm_reset_eval(void)
Definition: eval_cps.c:5818
void lbm_set_hide_trapped_error(bool hide)
Definition: eval_cps.c:507
struct eval_context_s eval_context_t
void lbm_kill_eval(void)
Definition: eval_cps.c:5841
void lbm_set_timestamp_us_callback(uint32_t(*fptr)(void))
void lbm_run_eval(void)
Definition: eval_cps.c:5943
bool lbm_event(lbm_flat_value_t *fv)
Definition: eval_cps.c:454
lbm_value(* fundamental_fun)(lbm_value *, lbm_uint, eval_context_t *)
Definition: eval_cps.h:104
lbm_cid lbm_get_event_handler_pid(void)
Definition: eval_cps.c:403
void lbm_request_gc(void)
Definition: eval_cps.c:286
int lbm_perform_gc(void)
Definition: eval_cps.c:1797
void lbm_continue_eval(void)
Definition: eval_cps.c:5836
void lbm_surrender_quota(void)
Definition: eval_cps.c:527
void lbm_critical_error(void)
Definition: eval_cps.c:1225
void lbm_set_dynamic_load_callback(bool(*fptr)(const char *, const char **))
Definition: eval_cps.c:377
bool lbm_eval_init(void)
Definition: eval_cps.c:6074
bool lbm_eval_init_events(unsigned int num_events)
Definition: eval_cps.c:6107
bool lbm_unblock_ctx_unboxed(lbm_cid cid, lbm_value unboxed)
Definition: eval_cps.c:1543
void lbm_blocked_iterator(ctx_fun f, void *, void *)
Definition: eval_cps.c:1020
void lbm_set_critical_error_callback(void(*fptr)(void))
Definition: eval_cps.c:357
bool lbm_find_receiver_and_send(lbm_cid cid, lbm_value msg)
Definition: eval_cps.c:1627
void lbm_undo_block_ctx_from_extension(void)
Definition: eval_cps.c:1588
void lbm_set_ctx_done_callback(void(*fptr)(eval_context_t *))
Definition: eval_cps.c:367
void lbm_set_event_handler_pid(lbm_cid pid)
Definition: eval_cps.c:407
bool lbm_event_queue_is_empty(void)
Definition: eval_cps.c:476
bool lbm_event_handler_exists(void)
Definition: eval_cps.c:411
bool lbm_mailbox_change_size(eval_context_t *ctx, lbm_uint new_size)
Definition: eval_cps.c:1458
const fundamental_fun fundamental_table[]
Definition: fundamental.c:1518
bool lbm_unblock_ctx(lbm_cid cid, lbm_flat_value_t *fv)
Definition: eval_cps.c:1520
lbm_cid lbm_create_ctx(lbm_value program, lbm_value env, lbm_uint stack_size, char *name)
Definition: eval_cps.c:1448
lbm_flash_status request_flash_storage_cell(lbm_value val, lbm_value *res)
Definition: eval_cps.c:5033
void lbm_add_eval_symbols(void)
Definition: eval_cps.c:5930
void lbm_all_ctxs_iterator(ctx_fun f, void *arg1, void *arg2)
Definition: eval_cps.c:1006
void lbm_set_usleep_callback(void(*fptr)(uint32_t))
Definition: eval_cps.c:362
bool lbm_event_unboxed(lbm_value unboxed)
Definition: eval_cps.c:439
void lbm_set_printf_callback(int(*prnt)(const char *,...))
Definition: eval_cps.c:372
lbm_value eval_cps_get_env(void)
bool lbm_unblock_ctx_r(lbm_cid cid)
Definition: eval_cps.c:1524
void lbm_pause_eval_with_gc(uint32_t num_free)
Definition: eval_cps.c:5830
int(* lbm_printf_callback)(const char *,...)
Definition: eval_cps.c:354
int lbm_remove_done_ctx(lbm_cid cid, lbm_value *v)
void lbm_set_error_reason(const char *error_str)
Definition: eval_cps.c:1132
void(* ctx_fun)(eval_context_t *, void *, void *)
Definition: eval_cps.h:114
void lbm_set_verbose(bool verbose)
Definition: eval_cps.c:503
eval_context_t * lbm_get_current_context(void)
Definition: eval_cps.c:518
void lbm_toggle_verbose(void)
Definition: eval_cps.c:499
void lbm_set_eval_step_quota(uint32_t quota)
Definition: eval_cps.c:318
uint32_t lbm_get_eval_state(void)
Definition: eval_cps.c:5846
void lbm_block_ctx_from_extension(void)
Definition: eval_cps.c:1581
bool lbm_event_define(lbm_value key, lbm_flat_value_t *fv)
Definition: eval_cps.c:435
void lbm_pause_eval(void)
Definition: eval_cps.c:5824
lbm_cid lbm_get_current_cid(void)
Definition: eval_cps.c:511
void lbm_block_ctx_from_extension_timeout(float s)
Definition: eval_cps.c:1577
void lbm_running_iterator(ctx_fun f, void *, void *)
Definition: eval_cps.c:1014
void lbm_set_error_suspect(lbm_value suspect)
Definition: eval_cps.c:1127
lbm_flash_status
Definition: heap.h:195
int32_t lbm_cid
Definition: lbm_types.h:64
int32_t lbm_int
Definition: lbm_types.h:49
uint32_t lbm_uint
Definition: lbm_types.h:48
uint32_t lbm_value
Definition: lbm_types.h:44
Definition: eval_cps.h:64
lbm_int row0
Definition: eval_cps.h:83
char * name
Definition: eval_cps.h:79
struct eval_context_s * prev
Definition: eval_cps.h:86
lbm_value curr_env
Definition: eval_cps.h:67
lbm_cid parent
Definition: eval_cps.h:81
lbm_uint timestamp
Definition: eval_cps.h:76
uint32_t num_mail
Definition: eval_cps.h:70
lbm_value r
Definition: eval_cps.h:72
uint32_t flags
Definition: eval_cps.h:71
lbm_int row1
Definition: eval_cps.h:84
uint32_t mailbox_size
Definition: eval_cps.h:69
const char * error_reason
Definition: eval_cps.h:73
lbm_cid id
Definition: eval_cps.h:80
lbm_value program
Definition: eval_cps.h:65
bool app_cont
Definition: eval_cps.h:74
lbm_stack_t K
Definition: eval_cps.h:75
lbm_value curr_exp
Definition: eval_cps.h:66
lbm_value * mailbox
Definition: eval_cps.h:68
uint32_t state
Definition: eval_cps.h:78
struct eval_context_s * next
Definition: eval_cps.h:87
lbm_uint sleep_us
Definition: eval_cps.h:77
Definition: eval_cps.h:96
lbm_event_type_t type
Definition: eval_cps.h:97
lbm_uint buf_ptr
Definition: eval_cps.h:99
lbm_uint buf_len
Definition: eval_cps.h:100
lbm_uint parameter
Definition: eval_cps.h:98
Definition: lbm_flat_value.h:26
Definition: stack.h:33