Index: src/runtime/morphos-library.m ================================================================== --- src/runtime/morphos-library.m +++ src/runtime/morphos-library.m @@ -111,10 +111,12 @@ /* Standard library functions */ static struct Library *lib_init(struct ObjFWRTBase *base, BPTR seg_list, struct ExecBase *exec_base) { + SysBase = exec_base; + base->seg_list = seg_list; return &base->library; } @@ -126,37 +128,45 @@ base->library.lib_OpenCnt++; base->library.lib_Flags &= ~LIBF_DELEXP; return &base->library; } + +static BPTR +expunge(struct ObjFWRTBase *base) +{ + /* Still in use - set delayed expunge flag and refuse to expunge */ + if (base->library.lib_OpenCnt > 0) { + base->library.lib_Flags |= LIBF_DELEXP; + return 0; + } + + Remove(&base->library.lib_Node); + FreeMem((char *)base - base->library.lib_NegSize, + base->library.lib_NegSize + base->library.lib_PosSize); + + return base->seg_list; +} static BPTR lib_close(void) { struct ObjFWRTBase *base = (struct ObjFWRTBase *)REG_A6; /* Not used anymore and delayed expunge flag set -> expunge */ if (--base->library.lib_OpenCnt == 0 && (base->library.lib_Flags & LIBF_DELEXP)) - return lib_expunge(); + return expunge(base); return 0; } static BPTR lib_expunge(void) { - struct ObjFWRTBase *base = (struct ObjFWRTBase *)REG_A6; - - /* Still in use - set delayed expunge flag and refuse to expunge */ - if (base->library.lib_OpenCnt > 0) { - base->library.lib_Flags |= LIBF_DELEXP; - return 0; - } - - return base->seg_list; + return expunge((struct ObjFWRTBase *)REG_A6); } static void lib_null(void) { }