diff --git a/include/callback.h b/include/callback.h index ca557652..382efc56 100644 --- a/include/callback.h +++ b/include/callback.h @@ -95,6 +95,8 @@ public: void Install(CallBack_Handler handler,Bitu type,const char* description); void Install(CallBack_Handler handler,Bitu type,PhysPt addr,const char* description); + void Uninstall(); + //Only allocate a callback number void Allocate(CallBack_Handler handler,const char* description=0); Bit16u Get_callback() { diff --git a/include/inout.h b/include/inout.h index cb0b7e57..a49f639b 100644 --- a/include/inout.h +++ b/include/inout.h @@ -59,11 +59,13 @@ public: class IO_ReadHandleObject: private IO_Base{ public: void Install(Bitu port,IO_ReadHandler * handler,Bitu mask,Bitu range=1); + void Uninstall(); ~IO_ReadHandleObject(); }; class IO_WriteHandleObject: private IO_Base{ public: void Install(Bitu port,IO_WriteHandler * handler,Bitu mask,Bitu range=1); + void Uninstall(); ~IO_WriteHandleObject(); }; diff --git a/src/cpu/callback.cpp b/src/cpu/callback.cpp index ff5c92d7..c4ae982c 100644 --- a/src/cpu/callback.cpp +++ b/src/cpu/callback.cpp @@ -464,7 +464,7 @@ void CALLBACK_RemoveSetup(Bitu callback) { } } -CALLBACK_HandlerObject::~CALLBACK_HandlerObject(){ +void CALLBACK_HandlerObject::Uninstall(){ if(!installed) return; if(m_type == CALLBACK_HandlerObject::SETUP) { if(vectorhandler.installed){ @@ -485,6 +485,10 @@ CALLBACK_HandlerObject::~CALLBACK_HandlerObject(){ CALLBACK_DeAllocate(m_callback); } +CALLBACK_HandlerObject::~CALLBACK_HandlerObject(){ + Uninstall(); +} + void CALLBACK_HandlerObject::Install(CallBack_Handler handler,Bitu type,const char* description){ if(!installed) { installed=true; diff --git a/src/hardware/iohandler.cpp b/src/hardware/iohandler.cpp index 1f16a562..84cb21ea 100644 --- a/src/hardware/iohandler.cpp +++ b/src/hardware/iohandler.cpp @@ -118,11 +118,15 @@ void IO_ReadHandleObject::Install(Bitu port,IO_ReadHandler * handler,Bitu mask,B } else E_Exit("IO_readHandler allready installed port %x",port); } -IO_ReadHandleObject::~IO_ReadHandleObject(){ +void IO_ReadHandleObject::Uninstall(){ if(!installed) return; IO_FreeReadHandler(m_port,m_mask,m_range); } +IO_ReadHandleObject::~IO_ReadHandleObject(){ + Uninstall(); +} + void IO_WriteHandleObject::Install(Bitu port,IO_WriteHandler * handler,Bitu mask,Bitu range) { if(!installed) { installed=true; @@ -133,9 +137,13 @@ void IO_WriteHandleObject::Install(Bitu port,IO_WriteHandler * handler,Bitu mask } else E_Exit("IO_writeHandler allready installed port %x",port); } -IO_WriteHandleObject::~IO_WriteHandleObject(){ +void IO_WriteHandleObject::Uninstall() { if(!installed) return; IO_FreeWriteHandler(m_port,m_mask,m_range); +} + +IO_WriteHandleObject::~IO_WriteHandleObject(){ + Uninstall(); //LOG_MSG("FreeWritehandler called with port %X",m_port); }