diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2016-11-27 15:31:18 +0000 |
---|---|---|
committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2016-11-27 15:31:18 +0000 |
commit | c4b8857789e3f79a2ae0f7abe108999bf323b01a (patch) | |
tree | 6d2589211a2afd56169b46d54bb77e337bb69194 /frontends/amiga/memory.c | |
parent | 20432237883a04677f30f1758979fa0a4b9111e3 (diff) | |
download | netsurf-c4b8857789e3f79a2ae0f7abe108999bf323b01a.tar.gz netsurf-c4b8857789e3f79a2ae0f7abe108999bf323b01a.tar.bz2 |
Add low memory handler to purge unused slabs on OS3
TODO: find some way to purge NetSurf's memory cache safely from another process
Diffstat (limited to 'frontends/amiga/memory.c')
-rwxr-xr-x | frontends/amiga/memory.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/frontends/amiga/memory.c b/frontends/amiga/memory.c index d86f73d74..abf849db6 100755 --- a/frontends/amiga/memory.c +++ b/frontends/amiga/memory.c @@ -17,8 +17,11 @@ */ #ifndef __amigaos4__ +#include <proto/exec.h> +#include <exec/interrupts.h> #include <stdlib.h> #include "amiga/memory.h" +#include "amiga/os3support.h" #include "utils/log.h" ULONG __slab_max_size = 2048; /* Enable clib2's slab allocator */ @@ -60,5 +63,32 @@ void ami_memory_slab_dump(void) { __get_slab_usage(ami_memory_slab_callback); } + +static ASM ULONG ami_memory_handler(REG(a0, struct MemHandlerData *mhd), REG(a1, void *userdata), REG(a6, struct ExecBase *execbase)) +{ + __free_unused_slabs(); + + return MEM_ALL_DONE; +} + +struct Interrupt *ami_memory_init(void) +{ + struct Interrupt *memhandler = malloc(sizeof(struct Interrupt)); + + memhandler->is_Node.ln_Pri = 1; + memhandler->is_Node.ln_Name = "NetSurf slab memory handler"; + memhandler->is_Data = NULL; + memhandler->is_Code = (APTR)&ami_memory_handler; + AddMemHandler(memhandler); + + return memhandler; +} + +void ami_memory_fini(struct Interrupt *memhandler) +{ + RemMemHandler(memhandler); + free(memhandler); +} + #endif |