#include "prelude/params.hats"
#if VERBOSE_PRELUDE #then
#print "Loading [memory.sats] starts!\n"
#endif
typedef b0ytes (n:int) = @[byte?][n]
praxi ptr_to_b0ytes_v : {a:viewt@ype} {l:addr} a? @ l -<prf> b0ytes (sizeof a) @ l
praxi ptr_of_b0ytes_v : {a:viewt@ype} {l:addr} b0ytes (sizeof a) @ l -<prf> a? @ l
prfun array_v_of_byte_v
{a:viewt@ype} {n:nat} {l:addr} {nsz:int}
(pf_mul: MUL (n, sizeof a, nsz), pf_arr: b0ytes (nsz) @ l):<prf> @[a?][n] @ l
fun gc_init (): void = "ats_gc_init"
fun gc_memlim_get_word (): size_t =
"ats_gc_memlim_get_word"
fun gc_memlim_get_word_set (wsz: size_t): void =
"ats_gc_memlim_set_word"
fun gc_memlim_get_page (): size_t =
"ats_gc_memlim_get_page"
fun gc_memlim_get_page_set (wsz: size_t): void =
"ats_gc_memlim_set_page"
fun gc_max_memlim_get_word (): size_t =
"ats_gc_max_memlim_get_word"
fun gc_max_memlim_get_word_set (wsz: size_t): void =
"ats_gc_max_memlim_set_word"
fun gc_max_memlim_get_page (): size_t =
"ats_gc_max_memlim_get_page"
fun gc_max_memlim_get_page_set (wsz: size_t): void =
"ats_gc_max_memlim_set_page"
fun gc_chunk_count_limit_get (): int
= "ats_gc_chunk_count_limit_get"
fun gc_chunk_count_limit_set (n: int): void
= "ats_gc_chunk_count_limit_set"
fun gc_chunk_count_limit_max_get (): int
= "ats_gc_chunk_count_limit_max_get"
fun gc_chunk_count_limit_max_set (n: int): void
= "ats_gc_chunk_count_limit_max_set"
fun malloc_gc
{n:nat} (n: size_t n)
:<> [l:agz] (free_gc_v (n, l), b0ytes n @ l | ptr l)
= "ats_malloc_gc"
fun calloc_gc
{a:viewt@ype} {n:nat}
(n: size_t n, tsz: sizeof_t a)
:<> [l:agz] (free_gc_v (n, l), @[a?][n] @ l | ptr l)
= "ats_calloc_gc"
fun free_gc {n:nat} {l:addr}
(_: free_gc_v (n, l), _: b0ytes n @ l | p: ptr l):<> void
= "ats_free_gc"
fun realloc_gc
{n0,n:nat} {l0:addr} (
_: free_gc_v (n0, l0), _: b0ytes n0 @ l0 | _: ptr l0, _: size_t n
) :<> [l:agz] (free_gc_v (n, l), b0ytes n @ l | ptr l)
= "ats_realloc_gc"
dataview
malloc_v (n:int, addr) =
| {l:agz}
malloc_v_succ (n, l) of (free_ngc_v (n, l), b0ytes n @ l)
| malloc_v_fail (n, null) of ()
fun malloc_ngc {n:nat}
(n: size_t n):<> [l:addr] (malloc_v (n, l) | ptr l) = "ats_malloc_ngc"
dataview
calloc_v (a:viewt@ype, n:int, addr) =
| {l:agz}
calloc_v_succ (a, n, l) of (free_ngc_v (n, l), @[a?][n] @ l)
| calloc_v_fail (a, n, null) of ()
fun calloc_ngc
{a:viewt@ype} {n:nat}
(n: size_t n, tsz: sizeof_t a)
:<> [l:addr] (calloc_v (a, n, l) | ptr l) = "ats_calloc_ngc"
fun free_ngc {n:nat} {l:addr}
(_: free_ngc_v (n, l), _: b0ytes n @ l | p: ptr l):<> void= "ats_free_ngc"
dataview
realloc_v (
n0:int, n:int, addr, addr
) =
| {l0,l:agz}
realloc_v_succ (n0, n, l0, l) of (free_ngc_v (n, l), b0ytes n @ l)
| {l0:agz}
realloc_v_fail (n0, n, l0, null) of (free_ngc_v (n0, l0), b0ytes n0 @ l0)
fun realloc_ngc
{n0,n:nat} {l0:addr} (
_: free_ngc_v (n0, l0), _: b0ytes n0 @ l0
| _: ptr l0, _: size_t n
) :<> [l:addr] (realloc_v (n0, n, l0, l) | ptr l) = "ats_realloc_ngc"
#if VERBOSE_PRELUDE #then
#print "Loading [memory.sats] finishes!\n"
#endif