Avoid crash in ~LightsDriver_SystemMessage (#1663)
* Avoid crash in ~LightsDriver_SystemMessage This will avoid a crash caused by the fact LIGHTSMAN is destroyed after the other MAN objects * Rework code path for turning lights off on exit Calls to LightsDriver::reset removed from each driver to avoid any crashes LightsDriver::reset renamed to Rest to match surrounding style Added LightsManager::TurnOffAllLights, called before XXXMAN objects are deleted
This commit is contained in:
committed by
Colby Klein
parent
00c9b5b9d4
commit
23889bd7c8
@@ -512,6 +512,12 @@ bool LightsManager::IsEnabled() const
|
||||
return m_vpDrivers.size() >= 1 || PREFSMAN->m_bDebugLights;
|
||||
}
|
||||
|
||||
void LightsManager::TurnOffAllLights()
|
||||
{
|
||||
FOREACH( LightsDriver*, m_vpDrivers, iter )
|
||||
(*iter)->Reset();
|
||||
}
|
||||
|
||||
/*
|
||||
* (c) 2003-2004 Chris Danford
|
||||
* All rights reserved.
|
||||
|
||||
@@ -67,6 +67,7 @@ public:
|
||||
void BlinkCabinetLight( CabinetLight cl );
|
||||
void BlinkGameButton( GameInput gi );
|
||||
void BlinkActorLight( CabinetLight cl );
|
||||
void TurnOffAllLights();
|
||||
void PulseCoinCounter() { ++m_iQueuedCoinCounterPulses; }
|
||||
float GetActorLightLatencySeconds() const;
|
||||
|
||||
|
||||
@@ -286,6 +286,14 @@ void ShutdownGame()
|
||||
if( SOUNDMAN )
|
||||
SOUNDMAN->Shutdown();
|
||||
|
||||
/* Reset all lights to off.
|
||||
* This is done before ~LightsManager as some drivers use SCREENMAN
|
||||
* and similar when setting lights. */
|
||||
if( LIGHTSMAN )
|
||||
{
|
||||
LIGHTSMAN->TurnOffAllLights();
|
||||
}
|
||||
|
||||
SAFE_DELETE( SCREENMAN );
|
||||
SAFE_DELETE( STATSMAN );
|
||||
SAFE_DELETE( MESSAGEMAN );
|
||||
|
||||
@@ -30,7 +30,7 @@ void LightsDriver::Create( const RString &sDrivers, vector<LightsDriver *> &Add
|
||||
}
|
||||
}
|
||||
|
||||
void LightsDriver::reset()
|
||||
void LightsDriver::Reset()
|
||||
{
|
||||
LightsState state;
|
||||
ZERO( state.m_bCabinetLights );
|
||||
|
||||
@@ -17,8 +17,8 @@ public:
|
||||
|
||||
virtual void Set( const LightsState *ls ) = 0;
|
||||
|
||||
// Reset all lights to off
|
||||
void reset();
|
||||
// Reset all lights to off
|
||||
void Reset();
|
||||
};
|
||||
|
||||
#define REGISTER_LIGHTS_DRIVER_CLASS2( name, x ) \
|
||||
|
||||
@@ -13,7 +13,6 @@ LightsDriver_Export::LightsDriver_Export()
|
||||
|
||||
LightsDriver_Export::~LightsDriver_Export()
|
||||
{
|
||||
LightsDriver::reset();
|
||||
}
|
||||
|
||||
void LightsDriver_Export::Set( const LightsState *ls )
|
||||
|
||||
@@ -24,7 +24,6 @@ LightsDriver_LinuxParallel::LightsDriver_LinuxParallel()
|
||||
|
||||
LightsDriver_LinuxParallel::~LightsDriver_LinuxParallel()
|
||||
{
|
||||
LightsDriver::reset();
|
||||
// Reset all bits to zero and free the port's permissions
|
||||
outb( 0, PORT_ADDRESS );
|
||||
ioperm( PORT_ADDRESS, 1, 0 );
|
||||
|
||||
@@ -32,7 +32,6 @@ LightsDriver_Linux_PIUIO::LightsDriver_Linux_PIUIO()
|
||||
|
||||
LightsDriver_Linux_PIUIO::~LightsDriver_Linux_PIUIO()
|
||||
{
|
||||
LightsDriver::reset();
|
||||
if( fd >= 0 )
|
||||
close(fd);
|
||||
}
|
||||
|
||||
@@ -210,7 +210,6 @@ LightsDriver_SextetStream::LightsDriver_SextetStream()
|
||||
|
||||
LightsDriver_SextetStream::~LightsDriver_SextetStream()
|
||||
{
|
||||
LightsDriver::reset();
|
||||
if(IMPL != NULL)
|
||||
{
|
||||
delete IMPL;
|
||||
|
||||
@@ -12,11 +12,15 @@ LightsDriver_SystemMessage::LightsDriver_SystemMessage()
|
||||
|
||||
LightsDriver_SystemMessage::~LightsDriver_SystemMessage()
|
||||
{
|
||||
LightsDriver::reset();
|
||||
}
|
||||
|
||||
void LightsDriver_SystemMessage::Set( const LightsState *ls )
|
||||
{
|
||||
if (!PREFSMAN || !LIGHTSMAN || !SCREENMAN)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( !PREFSMAN->m_bDebugLights )
|
||||
return;
|
||||
|
||||
|
||||
@@ -57,7 +57,6 @@ LightsDriver_Win32Parallel::LightsDriver_Win32Parallel()
|
||||
|
||||
LightsDriver_Win32Parallel::~LightsDriver_Win32Parallel()
|
||||
{
|
||||
LightsDriver::reset();
|
||||
FreeLibrary( hDLL );
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user