LispBM
Loading...
Searching...
No Matches
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
28extern "C" {
29#endif
30
35#define EVAL_CPS_STATE_NONE 0
36#define EVAL_CPS_STATE_PAUSED 1
37#define EVAL_CPS_STATE_RUNNING 2
38#define EVAL_CPS_STATE_KILL 4
39#define EVAL_CPS_STATE_DEAD 8
40#define EVAL_CPS_STATE_RESET 16
41
44#define EVAL_CPS_DEFAULT_MAILBOX_SIZE 10
45
46// Make sure the flags fit in an u28. (do not go beyond 27 flags)
50#define EVAL_CPS_CONTEXT_FLAG_NOTHING (uint32_t)0x00
51#define EVAL_CPS_CONTEXT_FLAG_TRAP (uint32_t)0x01
52#define EVAL_CPS_CONTEXT_FLAG_CONST (uint32_t)0x02
53#define EVAL_CPS_CONTEXT_FLAG_CONST_SYMBOL_STRINGS (uint32_t)0x04
54#define EVAL_CPS_CONTEXT_FLAG_INCREMENTAL_READ (uint32_t)0x08
55#define EVAL_CPS_CONTEXT_FLAG_TRAP_UNROLL_RETURN (uint32_t)0x10
56#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)
62#define LBM_THREAD_STATE_READY (uint32_t)0u
63#define LBM_THREAD_STATE_BLOCKED (uint32_t)1u
64#define LBM_THREAD_STATE_TIMEOUT (uint32_t)2u
65#define LBM_THREAD_STATE_SLEEPING (uint32_t)4u
66#define LBM_THREAD_STATE_RECV_BL (uint32_t)8u
67#define LBM_THREAD_STATE_RECV_TO (uint32_t)16u
68#define LBM_THREAD_STATE_GC_BIT (uint32_t)(1u << 31)
74#define LBM_IS_STATE_TIMEOUT(X) (X & (LBM_THREAD_STATE_TIMEOUT | LBM_THREAD_STATE_RECV_TO))
75#define LBM_IS_STATE_WAKE_UP_WAKABLE(X) (X & (LBM_THREAD_STATE_SLEEPING | LBM_IS_STATE_TIMEOUT(X)))
76#define LBM_IS_STATE_UNBLOCKABLE(X) (X & (LBM_THREAD_STATE_BLOCKED | LBM_THREAD_STATE_TIMEOUT))
77#define LBM_IS_STATE_RECV(X) (X & (LBM_THREAD_STATE_RECV_BL | LBM_THREAD_STATE_RECV_TO))
82typedef struct eval_context_s{
86 lbm_value *mailbox; // Message passing mailbox */
87 uint32_t mailbox_size;
88 uint32_t num_mail; // Number of messages in mailbox
89 uint32_t flags;
91 const char *error_reason;
96 uint32_t state;
97 char *name;
100 // while reading
103 lbm_value reader_stream; // Reader stream register
104 // List structure
108
115
123
126
129
136typedef void (*ctx_fun)(eval_context_t *, void*, void*);
137
138extern int (*lbm_printf_callback)(const char *, ...);
139
140/* Common interface */
149void lbm_add_eval_symbols(void);
150
151/* Concurrent interface */
156bool lbm_eval_init(void);
157#ifdef LBM_USE_TIME_QUOTA
162void lbm_set_eval_time_quota(uint32_t quota);
163#else
168void lbm_set_eval_step_quota(uint32_t quota);
169#endif
174bool lbm_eval_init_events(unsigned int num_events);
186bool lbm_event_handler_exists(void);
208bool lbm_event_unboxed(lbm_value unboxed);
212bool lbm_event_queue_is_empty(void);
221
222#ifdef LBM_SINGLE_THREADED
226bool lbm_eval_step(int n);
227#else
231void lbm_run_eval(void);
232#endif
239void lbm_reset_eval(void);
244void lbm_pause_eval(void);
249void lbm_pause_eval_with_gc(uint32_t num_free);
253void lbm_continue_eval(void);
257void lbm_kill_eval(void);
262uint32_t lbm_get_eval_state(void);
273void lbm_set_error_reason(const char *error_str);
278void lbm_set_error_suspect(lbm_value suspect);
282void lbm_critical_error(void);
284void lbm_set_critical_error_callback(void (*fptr)(void));
295lbm_cid lbm_create_ctx(lbm_value program, lbm_value env, lbm_uint stack_size, char *name);
321bool lbm_unblock_ctx_r(lbm_cid cid);
329bool lbm_unblock_ctx_unboxed(lbm_cid cid, lbm_value unboxed);
337void lbm_all_ctxs_iterator(ctx_fun f, void *arg1, void *arg2);
344void lbm_running_iterator(ctx_fun f, void*, void*);
351void lbm_blocked_iterator(ctx_fun f, void*, void*);
354void lbm_toggle_verbose(void);
359void lbm_set_verbose(bool verbose);
363void lbm_set_hide_trapped_error(bool hide);
368void lbm_set_usleep_callback(void (*fptr)(uint32_t));
373void lbm_set_timestamp_us_callback(uint32_t (*fptr)(void));
379void lbm_set_ctx_done_callback(void (*fptr)(eval_context_t *));
385void lbm_set_printf_callback(int (*prnt)(const char*, ...));
389void lbm_set_dynamic_load_callback(bool (*fptr)(const char *, const char **));
395
404void lbm_surrender_quota(void);
411
413 //bool lift_array_flash(lbm_value flash_cell, char *data, lbm_uint num_elt);
414
428int lbm_perform_gc(void);
432void lbm_request_gc(void);
433#ifdef __cplusplus
434}
435#endif
436#endif
lbm_event_type_t
Definition eval_cps.h:110
@ LBM_EVENT_DEFINE
Definition eval_cps.h:113
@ LBM_EVENT_FOR_HANDLER
Definition eval_cps.h:111
@ LBM_EVENT_UNBLOCK_CTX
Definition eval_cps.h:112
void lbm_reset_eval(void)
Definition eval_cps.c:5806
void lbm_set_hide_trapped_error(bool hide)
Definition eval_cps.c:557
struct eval_context_s eval_context_t
void lbm_kill_eval(void)
Definition eval_cps.c:5829
void lbm_set_timestamp_us_callback(uint32_t(*fptr)(void))
void lbm_run_eval(void)
Definition eval_cps.c:5980
bool lbm_event(lbm_flat_value_t *fv)
Definition eval_cps.c:504
lbm_cid lbm_get_event_handler_pid(void)
Definition eval_cps.c:453
void lbm_request_gc(void)
Definition eval_cps.c:334
int lbm_perform_gc(void)
Definition eval_cps.c:1794
void lbm_continue_eval(void)
Definition eval_cps.c:5824
void lbm_surrender_quota(void)
Definition eval_cps.c:577
void lbm_critical_error(void)
Definition eval_cps.c:1218
void lbm_set_dynamic_load_callback(bool(*fptr)(const char *, const char **))
Definition eval_cps.c:427
bool lbm_eval_init(void)
Definition eval_cps.c:6111
bool lbm_eval_init_events(unsigned int num_events)
Definition eval_cps.c:6146
bool lbm_unblock_ctx_unboxed(lbm_cid cid, lbm_value unboxed)
Definition eval_cps.c:1537
void lbm_blocked_iterator(ctx_fun f, void *, void *)
Definition eval_cps.c:1034
void lbm_set_critical_error_callback(void(*fptr)(void))
Definition eval_cps.c:407
lbm_value(* fundamental_fun)(lbm_value *, lbm_uint)
Definition eval_cps.h:125
bool lbm_find_receiver_and_send(lbm_cid cid, lbm_value msg)
Definition eval_cps.c:1621
void lbm_undo_block_ctx_from_extension(void)
Definition eval_cps.c:1582
void lbm_set_ctx_done_callback(void(*fptr)(eval_context_t *))
Definition eval_cps.c:417
void lbm_set_event_handler_pid(lbm_cid pid)
Definition eval_cps.c:457
bool lbm_event_queue_is_empty(void)
Definition eval_cps.c:526
bool lbm_event_handler_exists(void)
Definition eval_cps.c:461
bool lbm_mailbox_change_size(eval_context_t *ctx, lbm_uint new_size)
Definition eval_cps.c:1452
const fundamental_fun fundamental_table[]
Definition fundamental.c:1467
bool lbm_unblock_ctx(lbm_cid cid, lbm_flat_value_t *fv)
Definition eval_cps.c:1514
lbm_cid lbm_create_ctx(lbm_value program, lbm_value env, lbm_uint stack_size, char *name)
Definition eval_cps.c:1442
lbm_flash_status request_flash_storage_cell(lbm_value val, lbm_value *res)
Definition eval_cps.c:5031
void lbm_add_eval_symbols(void)
Definition eval_cps.c:5918
void lbm_all_ctxs_iterator(ctx_fun f, void *arg1, void *arg2)
Definition eval_cps.c:1020
void lbm_set_usleep_callback(void(*fptr)(uint32_t))
Definition eval_cps.c:412
bool lbm_event_unboxed(lbm_value unboxed)
Definition eval_cps.c:489
void lbm_set_printf_callback(int(*prnt)(const char *,...))
Definition eval_cps.c:422
lbm_value eval_cps_get_env(void)
bool lbm_unblock_ctx_r(lbm_cid cid)
Definition eval_cps.c:1518
eval_context_t * lbm_get_current_context(void)
Definition eval_cps.c:568
void lbm_pause_eval_with_gc(uint32_t num_free)
Definition eval_cps.c:5818
int(* lbm_printf_callback)(const char *,...)
Definition eval_cps.c:404
int lbm_remove_done_ctx(lbm_cid cid, lbm_value *v)
void lbm_set_error_reason(const char *error_str)
Definition eval_cps.c:1125
void(* ctx_fun)(eval_context_t *, void *, void *)
Definition eval_cps.h:136
void lbm_set_verbose(bool verbose)
Definition eval_cps.c:553
void lbm_toggle_verbose(void)
Definition eval_cps.c:549
void lbm_set_eval_step_quota(uint32_t quota)
Definition eval_cps.c:368
uint32_t lbm_get_eval_state(void)
Definition eval_cps.c:5834
void lbm_block_ctx_from_extension(void)
Definition eval_cps.c:1575
bool lbm_event_define(lbm_value key, lbm_flat_value_t *fv)
Definition eval_cps.c:485
void lbm_pause_eval(void)
Definition eval_cps.c:5812
lbm_cid lbm_get_current_cid(void)
Definition eval_cps.c:561
void lbm_block_ctx_from_extension_timeout(float s)
Definition eval_cps.c:1571
void lbm_running_iterator(ctx_fun f, void *, void *)
Definition eval_cps.c:1028
void lbm_set_error_suspect(lbm_value suspect)
Definition eval_cps.c:1120
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:82
lbm_int row0
Definition eval_cps.h:101
char * name
Definition eval_cps.h:97
struct eval_context_s * prev
Definition eval_cps.h:105
lbm_value curr_env
Definition eval_cps.h:85
lbm_cid parent
Definition eval_cps.h:99
lbm_uint timestamp
Definition eval_cps.h:94
uint32_t num_mail
Definition eval_cps.h:88
lbm_value r
Definition eval_cps.h:90
lbm_value reader_stream
Definition eval_cps.h:103
uint32_t flags
Definition eval_cps.h:89
lbm_int row1
Definition eval_cps.h:102
uint32_t mailbox_size
Definition eval_cps.h:87
const char * error_reason
Definition eval_cps.h:91
lbm_cid id
Definition eval_cps.h:98
lbm_value program
Definition eval_cps.h:83
bool app_cont
Definition eval_cps.h:92
lbm_stack_t K
Definition eval_cps.h:93
lbm_value curr_exp
Definition eval_cps.h:84
lbm_value * mailbox
Definition eval_cps.h:86
uint32_t state
Definition eval_cps.h:96
struct eval_context_s * next
Definition eval_cps.h:106
lbm_uint sleep_us
Definition eval_cps.h:95
Definition eval_cps.h:117
lbm_event_type_t type
Definition eval_cps.h:118
lbm_uint buf_ptr
Definition eval_cps.h:120
lbm_uint buf_len
Definition eval_cps.h:121
lbm_uint parameter
Definition eval_cps.h:119
Definition lbm_flat_value.h:26
Definition stack.h:33