95 lines
2.4 KiB
C
95 lines
2.4 KiB
C
/* Copyright (C) 2025 Aryadev Chavali
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Public License Version 2
|
|
* for details.
|
|
|
|
* You may distribute and modify this code under the terms of the
|
|
* GNU General Public License Version 2, which you should have received a copy
|
|
of along with this
|
|
* program. If not, please go to <https://www.gnu.org/licenses/>.
|
|
|
|
* Created: 2025-05-12
|
|
* Description:
|
|
*/
|
|
|
|
#include <lisp/context.h>
|
|
|
|
#include <string.h>
|
|
|
|
// Allocates against stable memory i.e. we can have pointers of this lying
|
|
// around without any fear of them being thrown away.
|
|
void *context_alloc(context_t *context, u64 size)
|
|
{
|
|
return arena_alloc(&context->memory, size);
|
|
}
|
|
|
|
// Allocate against a "scratch space", separate from main memory, for internal
|
|
// use.
|
|
void *context_salloc(context_t *context, u64 size)
|
|
{
|
|
return arena_alloc(&context->scratch, size);
|
|
}
|
|
|
|
void context_reset_read(context_t *context)
|
|
{
|
|
arena_reset(&context->read);
|
|
}
|
|
|
|
void context_reset_scratch(context_t *context)
|
|
{
|
|
arena_reset(&context->scratch);
|
|
}
|
|
|
|
void context_reset(context_t *context)
|
|
{
|
|
arena_reset(&context->memory);
|
|
arena_reset(&context->read);
|
|
arena_reset(&context->scratch);
|
|
}
|
|
|
|
void context_cleanup(context_t *context)
|
|
{
|
|
if (!context)
|
|
return;
|
|
arena_cleanup(&context->memory);
|
|
arena_cleanup(&context->read);
|
|
arena_cleanup(&context->scratch);
|
|
memset(context, 0, sizeof(*context));
|
|
}
|
|
|
|
void context_report(context_t *context)
|
|
{
|
|
#if DEBUG
|
|
// Figure this out at runtime
|
|
u64 mem_used = 0, mem_cap = 0;
|
|
for (page_t *page = context->memory.start; page; page = page->next)
|
|
{
|
|
mem_used += page->size;
|
|
mem_cap += page->capacity;
|
|
}
|
|
|
|
u64 read_used = 0, read_cap = 0;
|
|
for (page_t *page = context->read.start; page; page = page->next)
|
|
{
|
|
read_used += page->size;
|
|
read_cap += page->capacity;
|
|
}
|
|
|
|
u64 scr_used = 0, scr_cap = 0;
|
|
for (page_t *page = context->scratch.start; page; page = page->next)
|
|
{
|
|
scr_used += page->size;
|
|
scr_cap += page->capacity;
|
|
}
|
|
|
|
info("<Context>: %luB/%luB main memory used\n", mem_used, mem_cap);
|
|
info("<Context>: %luB/%luB read space used\n", read_used, read_cap);
|
|
info("<Context>: %luB/%luB scratch space used\n", scr_used, scr_cap);
|
|
#else
|
|
(void)context;
|
|
#endif
|
|
}
|