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:
Gareth Francis
2018-05-10 18:04:44 -07:00
committed by Colby Klein
parent 00c9b5b9d4
commit 23889bd7c8
11 changed files with 23 additions and 9 deletions
+6
View File
@@ -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.
+1
View File
@@ -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;
+8
View File
@@ -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 );
+1 -1
View File
@@ -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 );
+2 -2
View File
@@ -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 ) \
-1
View File
@@ -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 );
}