1
0
Fork 0

Codechange: Use unique_ptr to manage drivers.

pull/13909/head
Peter Nelson 2025-03-26 23:54:55 +00:00 committed by Peter Nelson
parent c3457cd4c0
commit d95422561b
27 changed files with 38 additions and 43 deletions

View File

@ -139,20 +139,18 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
FioFOpenFile(HWACCELERATION_TEST_FILE, "w", BASE_DIR); FioFOpenFile(HWACCELERATION_TEST_FILE, "w", BASE_DIR);
} }
Driver *oldd = *GetActiveDriver(type); /* Keep old driver in case we need to switch back, or may still need to process an OS callback. */
Driver *newd = d->CreateInstance(); auto oldd = std::move(GetActiveDriver(type));
*GetActiveDriver(type) = newd; GetActiveDriver(type) = d->CreateInstance();
auto err = newd->Start({}); auto err = GetActiveDriver(type)->Start({});
if (!err) { if (!err) {
Debug(driver, 1, "Successfully probed {} driver '{}'", GetDriverTypeName(type), d->name); Debug(driver, 1, "Successfully probed {} driver '{}'", GetDriverTypeName(type), d->name);
delete oldd;
return true; return true;
} }
*GetActiveDriver(type) = oldd; GetActiveDriver(type) = std::move(oldd);
Debug(driver, 1, "Probing {} driver '{}' failed with error: {}", GetDriverTypeName(type), d->name, *err); Debug(driver, 1, "Probing {} driver '{}' failed with error: {}", GetDriverTypeName(type), d->name, *err);
delete newd;
if (type == Driver::DT_VIDEO && _video_hw_accel && d->UsesHardwareAcceleration()) { if (type == Driver::DT_VIDEO && _video_hw_accel && d->UsesHardwareAcceleration()) {
_video_hw_accel = false; _video_hw_accel = false;
@ -185,17 +183,14 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
if (!StrEqualsIgnoreCase(dname, d->name)) continue; if (!StrEqualsIgnoreCase(dname, d->name)) continue;
/* Found our driver, let's try it */ /* Found our driver, let's try it */
Driver *newd = d->CreateInstance(); auto newd = d->CreateInstance();
auto err = newd->Start(parms); auto err = newd->Start(parms);
if (err) { if (err) {
delete newd;
UserError("Unable to load driver '{}'. The error was: {}", d->name, *err); UserError("Unable to load driver '{}'. The error was: {}", d->name, *err);
} }
Debug(driver, 1, "Successfully loaded {} driver '{}'", GetDriverTypeName(type), d->name); Debug(driver, 1, "Successfully loaded {} driver '{}'", GetDriverTypeName(type), d->name);
delete *GetActiveDriver(type); GetActiveDriver(type) = std::move(newd);
*GetActiveDriver(type) = newd;
return true; return true;
} }
UserError("No such {} driver: {}\n", GetDriverTypeName(type), dname); UserError("No such {} driver: {}\n", GetDriverTypeName(type), dname);

View File

@ -81,10 +81,10 @@ private:
* @param type The type to get the driver for. * @param type The type to get the driver for.
* @return The active driver. * @return The active driver.
*/ */
static Driver **GetActiveDriver(Driver::Type type) static std::unique_ptr<Driver> &GetActiveDriver(Driver::Type type)
{ {
static Driver *s_driver[3] = { nullptr, nullptr, nullptr }; static std::array<std::unique_ptr<Driver>, Driver::DT_END> s_driver{};
return &s_driver[type]; return s_driver[type];
} }
/** /**
@ -123,7 +123,7 @@ public:
static void ShutdownDrivers() static void ShutdownDrivers()
{ {
for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) { for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) {
Driver *driver = *GetActiveDriver(dt); auto &driver = GetActiveDriver(dt);
if (driver != nullptr) driver->Stop(); if (driver != nullptr) driver->Stop();
} }
} }
@ -144,7 +144,7 @@ public:
* Create an instance of this driver-class. * Create an instance of this driver-class.
* @return The instance. * @return The instance.
*/ */
virtual Driver *CreateInstance() const = 0; virtual std::unique_ptr<Driver> CreateInstance() const = 0;
}; };
#endif /* DRIVER_H */ #endif /* DRIVER_H */

View File

@ -41,7 +41,7 @@ public:
static const int PRIORITY = 2; static const int PRIORITY = 2;
#endif #endif
FMusicDriver_Allegro() : DriverFactoryBase(Driver::DT_MUSIC, PRIORITY, "allegro", "Allegro MIDI Driver") {} FMusicDriver_Allegro() : DriverFactoryBase(Driver::DT_MUSIC, PRIORITY, "allegro", "Allegro MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Allegro(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Allegro>(); }
}; };
#endif /* MUSIC_ALLEGRO_H */ #endif /* MUSIC_ALLEGRO_H */

View File

@ -41,7 +41,7 @@ private:
class FMusicDriver_BeMidi : public DriverFactoryBase { class FMusicDriver_BeMidi : public DriverFactoryBase {
public: public:
FMusicDriver_BeMidi() : DriverFactoryBase(Driver::DT_MUSIC, 10, "bemidi", "BeOS MIDI Driver") {} FMusicDriver_BeMidi() : DriverFactoryBase(Driver::DT_MUSIC, 10, "bemidi", "BeOS MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_BeMidi(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_BeMidi>(); }
}; };
#endif /* MUSIC_BEMIDI_H */ #endif /* MUSIC_BEMIDI_H */

View File

@ -31,7 +31,7 @@ public:
class FMusicDriver_Cocoa : public DriverFactoryBase { class FMusicDriver_Cocoa : public DriverFactoryBase {
public: public:
FMusicDriver_Cocoa() : DriverFactoryBase(Driver::DT_MUSIC, 10, "cocoa", "Cocoa MIDI Driver") {} FMusicDriver_Cocoa() : DriverFactoryBase(Driver::DT_MUSIC, 10, "cocoa", "Cocoa MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Cocoa(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Cocoa>(); }
}; };
#endif /* MUSIC_MACOSX_COCOA_H */ #endif /* MUSIC_MACOSX_COCOA_H */

View File

@ -35,7 +35,7 @@ public:
class FMusicDriver_DMusic : public DriverFactoryBase { class FMusicDriver_DMusic : public DriverFactoryBase {
public: public:
FMusicDriver_DMusic() : DriverFactoryBase(Driver::DT_MUSIC, 10, "dmusic", "DirectMusic MIDI Driver") {} FMusicDriver_DMusic() : DriverFactoryBase(Driver::DT_MUSIC, 10, "dmusic", "DirectMusic MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_DMusic(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_DMusic>(); }
}; };
#endif /* MUSIC_DMUSIC_H */ #endif /* MUSIC_DMUSIC_H */

View File

@ -39,7 +39,7 @@ public:
class FMusicDriver_ExtMidi : public DriverFactoryBase { class FMusicDriver_ExtMidi : public DriverFactoryBase {
public: public:
FMusicDriver_ExtMidi() : DriverFactoryBase(Driver::DT_MUSIC, 3, "extmidi", "External MIDI Driver") {} FMusicDriver_ExtMidi() : DriverFactoryBase(Driver::DT_MUSIC, 3, "extmidi", "External MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_ExtMidi(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_ExtMidi>(); }
}; };
#endif /* MUSIC_EXTERNAL_H */ #endif /* MUSIC_EXTERNAL_H */

View File

@ -33,7 +33,7 @@ public:
class FMusicDriver_FluidSynth : public DriverFactoryBase { class FMusicDriver_FluidSynth : public DriverFactoryBase {
public: public:
FMusicDriver_FluidSynth() : DriverFactoryBase(Driver::DT_MUSIC, 5, "fluidsynth", "FluidSynth MIDI Driver") {} FMusicDriver_FluidSynth() : DriverFactoryBase(Driver::DT_MUSIC, 5, "fluidsynth", "FluidSynth MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_FluidSynth(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_FluidSynth>(); }
}; };
#endif /* MUSIC_FLUIDSYNTH_H */ #endif /* MUSIC_FLUIDSYNTH_H */

View File

@ -45,7 +45,7 @@ public:
*/ */
static MusicDriver *GetInstance() static MusicDriver *GetInstance()
{ {
return static_cast<MusicDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_MUSIC)); return static_cast<MusicDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_MUSIC).get());
} }
}; };

View File

@ -33,7 +33,7 @@ public:
class FMusicDriver_Null : public DriverFactoryBase { class FMusicDriver_Null : public DriverFactoryBase {
public: public:
FMusicDriver_Null() : DriverFactoryBase(Driver::DT_MUSIC, 1, "null", "Null Music Driver") {} FMusicDriver_Null() : DriverFactoryBase(Driver::DT_MUSIC, 1, "null", "Null Music Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Null(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Null>(); }
}; };
#endif /* MUSIC_NULL_H */ #endif /* MUSIC_NULL_H */

View File

@ -33,7 +33,7 @@ public:
class FMusicDriver_Win32 : public DriverFactoryBase { class FMusicDriver_Win32 : public DriverFactoryBase {
public: public:
FMusicDriver_Win32() : DriverFactoryBase(Driver::DT_MUSIC, 5, "win32", "Win32 Music Driver") {} FMusicDriver_Win32() : DriverFactoryBase(Driver::DT_MUSIC, 5, "win32", "Win32 Music Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Win32(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Win32>(); }
}; };
#endif /* MUSIC_WIN32_H */ #endif /* MUSIC_WIN32_H */

View File

@ -27,7 +27,7 @@ public:
class FSoundDriver_Allegro : public DriverFactoryBase { class FSoundDriver_Allegro : public DriverFactoryBase {
public: public:
FSoundDriver_Allegro() : DriverFactoryBase(Driver::DT_SOUND, 4, "allegro", "Allegro Sound Driver (param hz,samples)") {} FSoundDriver_Allegro() : DriverFactoryBase(Driver::DT_SOUND, 4, "allegro", "Allegro Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_Allegro(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Allegro>(); }
}; };
#endif /* SOUND_ALLEGRO_H */ #endif /* SOUND_ALLEGRO_H */

View File

@ -23,7 +23,7 @@ public:
class FSoundDriver_Cocoa : public DriverFactoryBase { class FSoundDriver_Cocoa : public DriverFactoryBase {
public: public:
FSoundDriver_Cocoa() : DriverFactoryBase(Driver::DT_SOUND, 10, "cocoa", "Cocoa Sound Driver (param hz)") {} FSoundDriver_Cocoa() : DriverFactoryBase(Driver::DT_SOUND, 10, "cocoa", "Cocoa Sound Driver (param hz)") {}
Driver *CreateInstance() const override { return new SoundDriver_Cocoa(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Cocoa>(); }
}; };
#endif /* SOUND_COCOA_H */ #endif /* SOUND_COCOA_H */

View File

@ -26,7 +26,7 @@ public:
class FSoundDriver_Null : public DriverFactoryBase { class FSoundDriver_Null : public DriverFactoryBase {
public: public:
FSoundDriver_Null() : DriverFactoryBase(Driver::DT_SOUND, 1, "null", "Null Sound Driver") {} FSoundDriver_Null() : DriverFactoryBase(Driver::DT_SOUND, 1, "null", "Null Sound Driver") {}
Driver *CreateInstance() const override { return new SoundDriver_Null(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Null>(); }
}; };
#endif /* SOUND_NULL_H */ #endif /* SOUND_NULL_H */

View File

@ -25,7 +25,7 @@ public:
class FSoundDriver_SDL : public DriverFactoryBase { class FSoundDriver_SDL : public DriverFactoryBase {
public: public:
FSoundDriver_SDL() : DriverFactoryBase(Driver::DT_SOUND, 5, "sdl", "SDL Sound Driver (param hz,samples)") {} FSoundDriver_SDL() : DriverFactoryBase(Driver::DT_SOUND, 5, "sdl", "SDL Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_SDL(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_SDL>(); }
}; };
#endif /* SOUND_SDL_H */ #endif /* SOUND_SDL_H */

View File

@ -34,7 +34,7 @@ public:
*/ */
static SoundDriver *GetInstance() static SoundDriver *GetInstance()
{ {
return static_cast<SoundDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_SOUND)); return static_cast<SoundDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_SOUND).get());
} }
}; };

View File

@ -25,7 +25,7 @@ public:
class FSoundDriver_Win32 : public DriverFactoryBase { class FSoundDriver_Win32 : public DriverFactoryBase {
public: public:
FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver (param hz,samples)") {} FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_Win32(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Win32>(); }
}; };
#endif /* SOUND_WIN32_H */ #endif /* SOUND_WIN32_H */

View File

@ -25,7 +25,7 @@ public:
class FSoundDriver_XAudio2 : public DriverFactoryBase { class FSoundDriver_XAudio2 : public DriverFactoryBase {
public: public:
FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver (param hz,samples)") {} FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_XAudio2(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_XAudio2>(); }
}; };
#endif /* SOUND_XAUDIO2_H */ #endif /* SOUND_XAUDIO2_H */

View File

@ -46,7 +46,7 @@ protected:
class FVideoDriver_Allegro : public DriverFactoryBase { class FVideoDriver_Allegro : public DriverFactoryBase {
public: public:
FVideoDriver_Allegro() : DriverFactoryBase(Driver::DT_VIDEO, 4, "allegro", "Allegro Video Driver") {} FVideoDriver_Allegro() : DriverFactoryBase(Driver::DT_VIDEO, 4, "allegro", "Allegro Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Allegro(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Allegro>(); }
}; };
#endif /* VIDEO_ALLEGRO_H */ #endif /* VIDEO_ALLEGRO_H */

View File

@ -58,7 +58,7 @@ protected:
class FVideoDriver_CocoaOpenGL : public DriverFactoryBase { class FVideoDriver_CocoaOpenGL : public DriverFactoryBase {
public: public:
FVideoDriver_CocoaOpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 9, "cocoa-opengl", "Cocoa OpenGL Video Driver") {} FVideoDriver_CocoaOpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 9, "cocoa-opengl", "Cocoa OpenGL Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_CocoaOpenGL(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_CocoaOpenGL>(); }
protected: protected:
bool UsesHardwareAcceleration() const override { return true; } bool UsesHardwareAcceleration() const override { return true; }

View File

@ -129,7 +129,7 @@ protected:
class FVideoDriver_CocoaQuartz : public DriverFactoryBase { class FVideoDriver_CocoaQuartz : public DriverFactoryBase {
public: public:
FVideoDriver_CocoaQuartz() : DriverFactoryBase(Driver::DT_VIDEO, 8, "cocoa", "Cocoa Video Driver") {} FVideoDriver_CocoaQuartz() : DriverFactoryBase(Driver::DT_VIDEO, 8, "cocoa", "Cocoa Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_CocoaQuartz(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_CocoaQuartz>(); }
}; };
#endif /* VIDEO_COCOA_H */ #endif /* VIDEO_COCOA_H */

View File

@ -41,7 +41,7 @@ public:
static const int PRIORITY = 0; static const int PRIORITY = 0;
#endif #endif
FVideoDriver_Dedicated() : DriverFactoryBase(Driver::DT_VIDEO, PRIORITY, "dedicated", "Dedicated Video Driver") {} FVideoDriver_Dedicated() : DriverFactoryBase(Driver::DT_VIDEO, PRIORITY, "dedicated", "Dedicated Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Dedicated(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Dedicated>(); }
}; };
#endif /* VIDEO_DEDICATED_H */ #endif /* VIDEO_DEDICATED_H */

View File

@ -37,7 +37,7 @@ public:
class FVideoDriver_Null : public DriverFactoryBase { class FVideoDriver_Null : public DriverFactoryBase {
public: public:
FVideoDriver_Null() : DriverFactoryBase(Driver::DT_VIDEO, 0, "null", "Null Video Driver") {} FVideoDriver_Null() : DriverFactoryBase(Driver::DT_VIDEO, 0, "null", "Null Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Null(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Null>(); }
}; };
#endif /* VIDEO_NULL_H */ #endif /* VIDEO_NULL_H */

View File

@ -33,7 +33,7 @@ private:
class FVideoDriver_SDL_Default : public DriverFactoryBase { class FVideoDriver_SDL_Default : public DriverFactoryBase {
public: public:
FVideoDriver_SDL_Default() : DriverFactoryBase(Driver::DT_VIDEO, 5, "sdl", "SDL Video Driver") {} FVideoDriver_SDL_Default() : DriverFactoryBase(Driver::DT_VIDEO, 5, "sdl", "SDL Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_SDL_Default(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_SDL_Default>(); }
}; };
#endif /* VIDEO_SDL2_DEFAULT_H */ #endif /* VIDEO_SDL2_DEFAULT_H */

View File

@ -52,7 +52,7 @@ private:
class FVideoDriver_SDL_OpenGL : public DriverFactoryBase { class FVideoDriver_SDL_OpenGL : public DriverFactoryBase {
public: public:
FVideoDriver_SDL_OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 8, "sdl-opengl", "SDL OpenGL Video Driver") {} FVideoDriver_SDL_OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 8, "sdl-opengl", "SDL OpenGL Video Driver") {}
/* virtual */ Driver *CreateInstance() const override { return new VideoDriver_SDL_OpenGL(); } /* virtual */ std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_SDL_OpenGL>(); }
protected: protected:
bool UsesHardwareAcceleration() const override { return true; } bool UsesHardwareAcceleration() const override { return true; }

View File

@ -200,7 +200,7 @@ public:
*/ */
static VideoDriver *GetInstance() static VideoDriver *GetInstance()
{ {
return static_cast<VideoDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO)); return static_cast<VideoDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO).get());
} }
static std::string GetCaption(); static std::string GetCaption();

View File

@ -110,7 +110,7 @@ public:
class FVideoDriver_Win32GDI : public DriverFactoryBase { class FVideoDriver_Win32GDI : public DriverFactoryBase {
public: public:
FVideoDriver_Win32GDI() : DriverFactoryBase(Driver::DT_VIDEO, 9, "win32", "Win32 GDI Video Driver") {} FVideoDriver_Win32GDI() : DriverFactoryBase(Driver::DT_VIDEO, 9, "win32", "Win32 GDI Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Win32GDI(); } std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Win32GDI>(); }
}; };
#ifdef WITH_OPENGL #ifdef WITH_OPENGL
@ -168,7 +168,7 @@ protected:
class FVideoDriver_Win32OpenGL : public DriverFactoryBase { class FVideoDriver_Win32OpenGL : public DriverFactoryBase {
public: public:
FVideoDriver_Win32OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 10, "win32-opengl", "Win32 OpenGL Video Driver") {} FVideoDriver_Win32OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 10, "win32-opengl", "Win32 OpenGL Video Driver") {}
/* virtual */ Driver *CreateInstance() const override { return new VideoDriver_Win32OpenGL(); } /* virtual */ std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Win32OpenGL>(); }
protected: protected:
bool UsesHardwareAcceleration() const override { return true; } bool UsesHardwareAcceleration() const override { return true; }