BPTR libExpunge( struct LibraryManagerInterface *Self ) { struct ExpatBase *libBase; BPTR result = 0; libBase = (struct ExpatBase *)Self->Data.LibBase; if (libBase->libNode.lib_OpenCnt == 0) { Remove(&libBase->libNode.lib_Node); result = libBase->SegList; DropInterface((struct Interface *)IUtility); CloseLibrary(UtilityBase); DropInterface((struct Interface *)IDOS); CloseLibrary(DOSLib); DeleteLibrary(&libBase->libNode); } else { libBase->libNode.lib_Flags |= LIBF_DELEXP; } return result; }
static VOID DeleteDevice(struct DevBase *base) { /* Close interfaces */ DropInterface((APTR)base->i_timer); DropInterface((APTR)base->i_pci); DropInterface((APTR)base->i_utility); /* Close devices */ CloseDevice((APTR)&base->timer_request); /* Close libraries */ if(base->expansion_base != NULL) CloseLibrary(base->expansion_base); if(base->utility_base != NULL) CloseLibrary((APTR)base->utility_base); /* Free device's memory */ DeleteLibrary((APTR)base); return; }
struct Library *LIB_Init(Library *pOurBase, void *pSegList, ExecIFace *pSysBase) { SysBase = pSysBase->Data.LibBase; IExec = pSysBase; OurBase = pOurBase; SegList = pSegList; if (true == Lib_SetUp()) return OurBase; DeleteLibrary(pOurBase); return 0; }
uint LIB_Expunge(struct LibraryManagerInterface *pSelf) { if (OurBase->lib_OpenCnt) { OurBase->lib_Flags |= LIBF_DELEXP; return 0; } Lib_CleanUp(); Forbid(); Remove(&OurBase->lib_Node); Permit(); DeleteLibrary(pSelf->Data.LibBase); return (ULONG)SegList; }
STATIC SAVEDS ASM struct LibBase *LibInit( #ifdef __amigaos4__ struct LibBase *lb, APTR seglist, struct ExecIFace *pIExec) { IExec = pIExec; pIExec->Obtain(); #else REG(a6,struct Library *sysbase), REG(a0,APTR seglist), REG(d0,struct LibBase *lb)) { lb->lb_SysBase = sysbase; SysBase = (struct ExecBase *)sysbase; #endif lb->lb_LibNode.lib_Revision = REVISION; lb->lb_SegList = (BPTR)seglist; InitSemaphore(&lb->lb_BaseLock); InitSemaphore(&lb->lb_GUILock); return(lb); } STATIC SAVEDS ASM struct LibBase *LibOpen( #ifdef __amigaos4__ struct Interface *self, ULONG version) { struct LibBase *lb = (struct LibBase *)self->Data.LibBase; #else REG(a6,struct LibBase *lb)) { #endif BOOL libfail = FALSE; ObtainSemaphore(&lb->lb_BaseLock); lb->lb_LibNode.lib_OpenCnt++; lb->lb_LibNode.lib_Flags &= ~LIBF_DELEXP; if (lb->lb_LibNode.lib_OpenCnt == 1) { libfail = TRUE; lb->lb_DOSBase = OpenLibraryIFace((UBYTE *)"dos.library",36,(APTR *)&IDOS); lb->lb_GfxBase = OpenLibraryIFace((UBYTE *)"graphics.library",36,(APTR *)&IGraphics); lb->lb_IntuitionBase = OpenLibraryIFace((UBYTE *)"intuition.library",36,(APTR *)&IIntuition); lb->lb_UtilityBase = OpenLibraryIFace((UBYTE *)"utility.library",36,(APTR *)&IUtility); if (lb->lb_DOSBase && lb->lb_GfxBase && lb->lb_IntuitionBase && lb->lb_UtilityBase) { DOSBase = (struct DosLibrary *)lb->lb_DOSBase; GfxBase = (struct GfxBase *)lb->lb_GfxBase; IntuitionBase = (struct IntuitionBase *)lb->lb_IntuitionBase; UtilityBase = (struct UtilityBase *)lb->lb_UtilityBase; libfail = FALSE; } #ifdef __amigaos4__ if (libfail) LibClose2(self,FALSE); #else if (libfail) LibClose2(lb,FALSE); #endif } ReleaseSemaphore(&lb->lb_BaseLock); if (libfail) lb = NULL; return(lb); } STATIC SAVEDS ASM BPTR LibExpunge( #ifdef __amigaos4__ struct Interface *self) { struct LibBase *lb = (struct LibBase *)self->Data.LibBase; #else REG(a6,struct LibBase *lb)) { #endif BPTR seglist = (BPTR)NULL; if (lb->lb_LibNode.lib_OpenCnt == 0) { seglist = (BPTR)lb->lb_SegList; Remove((struct Node *)lb); #ifdef __amigaos4__ DeleteLibrary((struct Library *)lb); IExec->Release(); #else FreeMem((BYTE *)lb - lb->lb_LibNode.lib_NegSize, lb->lb_LibNode.lib_NegSize + lb->lb_LibNode.lib_PosSize); #endif } else { lb->lb_LibNode.lib_Flags |= LIBF_DELEXP; } return(seglist); } STATIC SAVEDS ASM BPTR LibClose( #ifdef __amigaos4__ struct Interface *self) { return(LibClose2(self,TRUE)); } #else REG(a6,struct LibBase *lb)) { return(LibClose2(lb,TRUE)); } #endif #ifdef __amigaos4__ STATIC BPTR LibClose2(struct Interface *self, BOOL dosem) { struct LibBase *lb = (struct LibBase *)self->Data.LibBase; #else STATIC BPTR LibClose2(struct LibBase *lb, BOOL dosem) { #endif BPTR seglist = (BPTR)NULL; if (dosem) ObtainSemaphore(&lb->lb_BaseLock); if (--lb->lb_LibNode.lib_OpenCnt == 0) { CloseLibraryIFace(lb->lb_UtilityBase,IUtility); CloseLibraryIFace(lb->lb_IntuitionBase,IIntuition); CloseLibraryIFace(lb->lb_GfxBase,IGraphics); CloseLibraryIFace(lb->lb_DOSBase,IDOS); lb->lb_UtilityBase = NULL; lb->lb_IntuitionBase = NULL; lb->lb_GfxBase = NULL; lb->lb_DOSBase = NULL; UtilityBase = NULL; IntuitionBase = NULL; GfxBase = NULL; DOSBase = NULL; } if (dosem) ReleaseSemaphore(&lb->lb_BaseLock); if (lb->lb_LibNode.lib_Flags & LIBF_DELEXP) { #ifdef __amigaos4__ seglist = LibExpunge(self); #else seglist = LibExpunge(lb); #endif } return(seglist); } /****************************************************************************/ #ifdef __amigaos4__ STATIC ULONG LibObtain(struct Interface *self) { return(self->Data.RefCount++); } STATIC ULONG LibRelease(struct Interface *self) { return(self->Data.RefCount--); } STATIC CONST APTR LibManagerVectors[] = { (APTR)LibObtain, (APTR)LibRelease, NULL, NULL, (APTR)LibOpen, (APTR)LibClose, (APTR)LibExpunge, NULL, (APTR)-1 }; STATIC CONST struct TagItem LibManagerTags[] = { {MIT_Name, (ULONG)"__library"}, {MIT_VectorTable, (ULONG)LibManagerVectors}, {MIT_Version, 1}, {TAG_DONE, 0} }; STATIC CONST APTR MainVectors[] = { (APTR)LibObtain, (APTR)LibRelease, NULL, NULL, (APTR)dnetcguiOpen, (APTR)dnetcguiClose, (APTR)dnetcguiHandleMsgs, (APTR)dnetcguiConsoleOut, (APTR)-1 }; STATIC CONST struct TagItem MainTags[] = { {MIT_Name, (ULONG)"main"}, {MIT_VectorTable, (ULONG)MainVectors}, {MIT_Version, 1}, {TAG_DONE, 0} }; STATIC CONST ULONG LibInterfaces[] = { (ULONG)LibManagerTags, (ULONG)MainTags, 0 }; extern APTR VecTable68K[]; /* dnetcgui_68k.s */ STATIC CONST struct TagItem LibCreateTags[] = { {CLT_DataSize, (ULONG)(sizeof(struct LibBase))}, {CLT_Interfaces, (ULONG)LibInterfaces}, {CLT_Vector68K, (ULONG)&VecTable68K}, {CLT_InitFunc, (ULONG)LibInit}, {TAG_DONE, 0} }; STATIC CONST struct Resident RomTag __attribute__((used)) = { RTC_MATCHWORD, (struct Resident *)&RomTag, (struct Resident *)&RomTag+1, RTF_AUTOINIT | RTF_NATIVE, VERSION, NT_LIBRARY, 0, (char *)ExLibName, (char *)ExLibID, (APTR)LibCreateTags }; #else ULONG LibExtFunc(VOID) { return(0); } static const APTR FuncTab[] = { (APTR)LibOpen, (APTR)LibClose, (APTR)LibExpunge, (APTR)LibExtFunc, (APTR)dnetcguiOpen, (APTR)dnetcguiClose, (APTR)dnetcguiHandleMsgs, (APTR)dnetcguiConsoleOut, (APTR)-1 }; struct InitTable { ULONG LibBaseSize; APTR *FunctionTable; struct MyDataInit *DataTable; APTR InitLibTable; }; static const struct InitTable InitTab = { sizeof(struct LibBase), (APTR)FuncTab, NULL, (APTR)LibInit }; extern VOID ENDCODE(VOID); static const struct Resident RomTag = { RTC_MATCHWORD, (struct Resident *)&RomTag, (APTR)&ENDCODE, RTF_AUTOINIT, VERSION, NT_LIBRARY, 0, (char *)ExLibName, (char *)ExLibID, &InitTab };