12#define TEALET_VERSION_MAJOR 0
13#define TEALET_VERSION_MINOR 4
14#define TEALET_VERSION_PATCH 3
17#define TEALET_VERSION "0.4.3"
20#define TEALET_VERSION_NUMBER ((TEALET_VERSION_MAJOR * 10000) + (TEALET_VERSION_MINOR * 100) + TEALET_VERSION_PATCH)
23#if defined TEALET_EXPORTS
24#define TEALET_API __declspec(dllexport)
25#elif defined TEALET_IMPORTS
26#define TEALET_API __declspec(dllimport)
38typedef void *(*tealet_malloc_t)(
size_t size,
void *context);
39typedef void (*tealet_free_t)(
void *ptr,
void *context);
50#define TEALET_ALLOC_INIT_MALLOC \
51 { (tealet_malloc_t) & malloc, (tealet_free_t)&free, 0 }
54#define TEALET_ALLOC_MALLOC(alloc, size) (alloc)->malloc_p((size), (alloc)->context)
55#define TEALET_ALLOC_FREE(alloc, ptr) (alloc)->free_p((ptr), (alloc)->context)
81#define TEALET_ERR_MEM -1
82#define TEALET_ERR_DEFUNCT -2
83#define TEALET_ERR_UNFORKABLE \
86#define TEALET_ERR_INVAL -4
87#define TEALET_ERR_INTEGRITY -5
88#define TEALET_ERR_PANIC -6
91#define TEALET_CONFIG_VERSION_1 1
92#define TEALET_CONFIG_CURRENT_VERSION TEALET_CONFIG_VERSION_1
95#define TEALET_CONFIGF_STACK_INTEGRITY (1u << 0)
96#define TEALET_CONFIGF_STACK_GUARD (1u << 1)
97#define TEALET_CONFIGF_STACK_SNAPSHOT (1u << 2)
100#define TEALET_STACK_GUARD_MODE_NONE 0
101#define TEALET_STACK_GUARD_MODE_READONLY 1
102#define TEALET_STACK_GUARD_MODE_NOACCESS 2
105#define TEALET_STACK_INTEGRITY_FAIL_ASSERT 0
106#define TEALET_STACK_INTEGRITY_FAIL_ERROR 1
107#define TEALET_STACK_INTEGRITY_FAIL_ABORT 2
110#define TEALET_DEFAULT_MAX_STACK_SIZE ((size_t)(16u * 1024u * 1024u))
124 unsigned int version;
126 size_t stack_integrity_bytes;
127 int stack_guard_mode;
128 int stack_integrity_fail_policy;
129 void *stack_guard_limit;
130 size_t max_stack_size;
131 unsigned int reserved[2];
135#define TEALET_CONFIG_INIT \
137 sizeof(tealet_config_t), TEALET_CONFIG_CURRENT_VERSION, 0u, 0, TEALET_STACK_GUARD_MODE_NONE, \
138 TEALET_STACK_INTEGRITY_FAIL_ASSERT, NULL, TEALET_DEFAULT_MAX_STACK_SIZE, { \
214#define TEALET_EXIT_DEFAULT 0
215#define TEALET_EXIT_DELETE 1
216#define TEALET_EXIT_DEFER 2
326#define TEALET_FORK_DEFAULT 0
327#define TEALET_FORK_SWITCH 1
329int tealet_fork(
tealet_t *current,
tealet_t **pother,
void **parg,
int flags);
392#define TEALET_ORIGIN_MAIN_LINEAGE (1u << 0)
393#define TEALET_ORIGIN_FORK (1u << 1)
409#define TEALET_STATUS_ACTIVE 0
411#define TEALET_STATUS_EXITED 1
413#define TEALET_STATUS_DEFUNCT -2
444 size_t bytes_allocated;
445 size_t bytes_allocated_peak;
446 size_t blocks_allocated;
447 size_t blocks_allocated_peak;
448 size_t blocks_allocated_total;
452 size_t stack_bytes_expanded;
453 size_t stack_bytes_naive;
455 size_t stack_chunk_count;
462void tealet_reset_peak_stats(
tealet_t *t);
660#define TEALET_MAIN(t) ((t)->main)
661#define TEALET_IS_MAIN(t) ((t) == TEALET_MAIN(t))
662#define TEALET_CURRENT_IS_MAIN(t) (tealet_current(t) == TEALET_MAIN(t))
663#define TEALET_IS_MAIN_LINEAGE(t) ((tealet_get_origin(t) & TEALET_ORIGIN_MAIN_LINEAGE) != 0)
664#define TEALET_IS_FORK(t) ((tealet_get_origin(t) & TEALET_ORIGIN_FORK) != 0)
668#define TEALET_RELATED(t1, t2) (TEALET_MAIN(t1) == TEALET_MAIN(t2))
671#define TEALET_EXTRA(t, tp) ((tp *)((t)->extra))
TEALET_API void * tealet_new_probe(tealet_t *dummy1, tealet_run_t dummy2, void **dummy3, void *dummy4)
Probe helper returning the effective initial far boundary at call site depth.
TEALET_API tealet_t * tealet_create(tealet_t *tealet, tealet_run_t run, void *stack_far)
Create a new tealet without starting it.
TEALET_API void tealet_finalize(tealet_t *tealet)
Destroy a previously initialized main tealet.
TEALET_API int tealet_configure_set(tealet_t *tealet, tealet_config_t *config)
Set runtime configuration for a main tealet.
TEALET_API void * tealet_get_far(tealet_t *tealet)
Get a tealet's far stack boundary marker.
TEALET_API void tealet_free(tealet_t *tealet, void *p)
Free memory using the tealet-domain allocator.
TEALET_API void * tealet_malloc(tealet_t *tealet, size_t s)
Allocate memory using the tealet-domain allocator.
TEALET_API int tealet_configure_check_stack(tealet_t *tealet, size_t stack_integrity_bytes)
Enable stack-integrity checking with practical defaults.
tealet_t *(* tealet_run_t)(tealet_t *current, void *arg)
Definition tealet.h:74
TEALET_API ptrdiff_t tealet_stack_diff(void *a, void *b)
Direction-aware stack pointer subtraction.
TEALET_API unsigned int tealet_get_origin(tealet_t *tealet)
Get tealet origin flags.
TEALET_API tealet_t * tealet_duplicate(tealet_t *tealet)
Duplicate a suspended tealet and its saved stack state.
TEALET_API void * tealet_stack_further(void *a, void *b)
Return whichever of two addresses is farther in stack-growth direction.
TEALET_API void tealet_delete(tealet_t *target)
Deallocate a non-main tealet.
TEALET_API tealet_t * tealet_new(tealet_t *tealet, tealet_run_t run, void **parg, void *stack_far)
Create and immediately start a new tealet.
TEALET_API size_t tealet_get_stacksize(tealet_t *tealet)
Get byte size of currently saved stack snapshot for a tealet.
TEALET_API tealet_t * tealet_previous(tealet_t *tealet)
TEALET_API int tealet_switch(tealet_t *target, void **parg)
Suspend current tealet and resume target.
TEALET_API int tealet_configure_get(tealet_t *tealet, tealet_config_t *config)
Get effective runtime configuration for a main tealet.
TEALET_API int tealet_exit(tealet_t *target, void *arg, int flags)
Exit current tealet and transfer control to target.
void *(* tealet_malloc_t)(size_t size, void *context)
Definition tealet.h:38
TEALET_API tealet_t * tealet_initialize(tealet_alloc_t *alloc, size_t extrasize)
Initialize libtealet and create the main tealet for the current thread.
TEALET_API void ** tealet_main_userpointer(tealet_t *tealet)
TEALET_API tealet_t * tealet_current(tealet_t *tealet)
TEALET_API int tealet_set_far(tealet_t *tealet, void *far_boundary)