diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2bac1ff91..daeb50fe2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -487,7 +487,6 @@ endif() # Start defining source files for ZDoom set( PLAT_WIN32_SOURCES sound/mididevices/music_win_mididevice.cpp - win32/critsec.cpp win32/hardware.cpp win32/helperthread.cpp win32/i_cd.cpp @@ -511,7 +510,6 @@ set( PLAT_POSIX_SOURCES posix/i_steam.cpp ) set( PLAT_SDL_SOURCES posix/sdl/crashcatcher.c - posix/sdl/critsec.cpp posix/sdl/hardware.cpp posix/sdl/i_gui.cpp posix/sdl/i_input.cpp @@ -528,7 +526,6 @@ set( PLAT_OSX_SOURCES posix/osx/i_specialpaths.mm posix/osx/zdoom.icns ) set( PLAT_COCOA_SOURCES - posix/cocoa/critsec.cpp posix/cocoa/i_input.mm posix/cocoa/i_joystick.cpp posix/cocoa/i_main.mm diff --git a/src/critsec.h b/src/critsec.h deleted file mode 100644 index ad510383b..000000000 --- a/src/critsec.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -// System independent critical sections without polluting the namespace with the operating system headers. -class FInternalCriticalSection; -FInternalCriticalSection *CreateCriticalSection(); -void DeleteCriticalSection(FInternalCriticalSection *c); -void EnterCriticalSection(FInternalCriticalSection *c); -void LeaveCriticalSection(FInternalCriticalSection *c); - -// This is just a convenience wrapper around the function interface. -class FCriticalSection -{ -public: - FCriticalSection() - { - c = CreateCriticalSection(); - } - - ~FCriticalSection() - { - DeleteCriticalSection(c); - } - - void Enter() - { - EnterCriticalSection(c); - } - - void Leave() - { - LeaveCriticalSection(c); - } - -private: - FInternalCriticalSection *c; - -}; diff --git a/src/posix/cocoa/critsec.cpp b/src/posix/cocoa/critsec.cpp deleted file mode 100644 index b9de5e798..000000000 --- a/src/posix/cocoa/critsec.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - ** critsec.cpp - ** - **--------------------------------------------------------------------------- - ** Copyright 2014 Alexey Lysiuk - ** All rights reserved. - ** - ** Redistribution and use in source and binary forms, with or without - ** modification, are permitted provided that the following conditions - ** are met: - ** - ** 1. Redistributions of source code must retain the above copyright - ** notice, this list of conditions and the following disclaimer. - ** 2. Redistributions in binary form must reproduce the above copyright - ** notice, this list of conditions and the following disclaimer in the - ** documentation and/or other materials provided with the distribution. - ** 3. The name of the author may not be used to endorse or promote products - ** derived from this software without specific prior written permission. - ** - ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - **--------------------------------------------------------------------------- - ** - */ - -#include "critsec.h" - -#include - -class FInternalCriticalSection -{ -public: - FInternalCriticalSection(); - ~FInternalCriticalSection(); - - void Enter(); - void Leave(); - -private: - pthread_mutex_t m_mutex; - -}; - -// TODO: add error handling - -FInternalCriticalSection::FInternalCriticalSection() -{ - pthread_mutexattr_t attributes; - pthread_mutexattr_init(&attributes); - pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_RECURSIVE); - - pthread_mutex_init(&m_mutex, &attributes); - - pthread_mutexattr_destroy(&attributes); -} - -FInternalCriticalSection::~FInternalCriticalSection() -{ - pthread_mutex_destroy(&m_mutex); -} - -void FInternalCriticalSection::Enter() -{ - pthread_mutex_lock(&m_mutex); -} - -void FInternalCriticalSection::Leave() -{ - pthread_mutex_unlock(&m_mutex); -} - - -FInternalCriticalSection *CreateCriticalSection() -{ - return new FInternalCriticalSection(); -} - -void DeleteCriticalSection(FInternalCriticalSection *c) -{ - delete c; -} - -void EnterCriticalSection(FInternalCriticalSection *c) -{ - c->Enter(); -} - -void LeaveCriticalSection(FInternalCriticalSection *c) -{ - c->Leave(); -} diff --git a/src/posix/sdl/critsec.cpp b/src/posix/sdl/critsec.cpp deleted file mode 100644 index 03a6202b9..000000000 --- a/src/posix/sdl/critsec.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* -** critsec.cpp -** -**--------------------------------------------------------------------------- -** Copyright 2006-2016 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -** Wraps an SDL mutex object. (A critical section is a Windows synchronization -** object similar to a mutex but optimized for access by threads belonging to -** only one process, hence the class name.) -*/ - -#include "SDL.h" -#include "i_system.h" -#include "doomerrors.h" - -class FInternalCriticalSection -{ -public: - FInternalCriticalSection() - { - CritSec = SDL_CreateMutex(); - if (CritSec == NULL) - { - I_FatalError("Failed to create a critical section mutex."); - } - } - ~FInternalCriticalSection() - { - if (CritSec != NULL) - { - SDL_DestroyMutex(CritSec); - } - } - void Enter() - { - if (SDL_mutexP(CritSec) != 0) - { - I_FatalError("Failed entering a critical section."); - } - } - void Leave() - { - if (SDL_mutexV(CritSec) != 0) - { - I_FatalError("Failed to leave a critical section."); - } - } -private: - SDL_mutex *CritSec; -}; - -FInternalCriticalSection *CreateCriticalSection() -{ - return new FInternalCriticalSection(); -} - -void DeleteCriticalSection(FInternalCriticalSection *c) -{ - delete c; -} - -void EnterCriticalSection(FInternalCriticalSection *c) -{ - c->Enter(); -} - -void LeaveCriticalSection(FInternalCriticalSection *c) -{ - c->Leave(); -} diff --git a/src/sound/i_musicinterns.h b/src/sound/i_musicinterns.h index b3cebfccf..0143fcb25 100644 --- a/src/sound/i_musicinterns.h +++ b/src/sound/i_musicinterns.h @@ -1,4 +1,5 @@ +#include #include "oplsynth/opl_mus_player.h" #include "c_cvars.h" #include "mus2midi.h" @@ -113,7 +114,7 @@ public: bool Pause(bool paused); protected: - FCriticalSection CritSec; + std::mutex CritSec; SoundStream *Stream; double Tempo; double Division; diff --git a/src/sound/mididevices/music_fluidsynth_mididevice.cpp b/src/sound/mididevices/music_fluidsynth_mididevice.cpp index 8314107df..be2229807 100644 --- a/src/sound/mididevices/music_fluidsynth_mididevice.cpp +++ b/src/sound/mididevices/music_fluidsynth_mididevice.cpp @@ -644,7 +644,7 @@ FString FluidSynthMIDIDevice::GetStats() } FString out; - CritSec.Enter(); + std::lock_guard lock(CritSec); int polyphony = fluid_synth_get_polyphony(FluidSynth); int voices = fluid_synth_get_active_voice_count(FluidSynth); double load = fluid_synth_get_cpu_load(FluidSynth); @@ -652,7 +652,6 @@ FString FluidSynthMIDIDevice::GetStats() fluid_settings_getint(FluidSettings, "synth.chorus.active", &chorus); fluid_settings_getint(FluidSettings, "synth.reverb.active", &reverb); fluid_settings_getint(FluidSettings, "synth.polyphony", &maxpoly); - CritSec.Leave(); out.Format("Voices: " TEXTCOLOR_YELLOW "%3d" TEXTCOLOR_NORMAL "/" TEXTCOLOR_ORANGE "%3d" TEXTCOLOR_NORMAL "(" TEXTCOLOR_RED "%3d" TEXTCOLOR_NORMAL ")" TEXTCOLOR_YELLOW "%6.2f" TEXTCOLOR_NORMAL "%% CPU " diff --git a/src/sound/mididevices/music_softsynth_mididevice.cpp b/src/sound/mididevices/music_softsynth_mididevice.cpp index 46fcb59e1..af1f1251c 100644 --- a/src/sound/mididevices/music_softsynth_mididevice.cpp +++ b/src/sound/mididevices/music_softsynth_mididevice.cpp @@ -237,9 +237,8 @@ void SoftSynthMIDIDevice::Stop() int SoftSynthMIDIDevice::StreamOutSync(MidiHeader *header) { - CritSec.Enter(); + std::lock_guard lock(CritSec); StreamOut(header); - CritSec.Leave(); return 0; } @@ -392,7 +391,7 @@ bool SoftSynthMIDIDevice::ServiceStream (void *buff, int numbytes) samples1 = samples; memset(buff, 0, numbytes); - CritSec.Enter(); + std::lock_guard lock(CritSec); while (Events != NULL && numsamples > 0) { double ticky = NextTickIn; @@ -434,7 +433,6 @@ bool SoftSynthMIDIDevice::ServiceStream (void *buff, int numbytes) { res = false; } - CritSec.Leave(); return res; } diff --git a/src/sound/mididevices/music_timidity_mididevice.cpp b/src/sound/mididevices/music_timidity_mididevice.cpp index 504fe8afe..0022f527a 100644 --- a/src/sound/mididevices/music_timidity_mididevice.cpp +++ b/src/sound/mididevices/music_timidity_mididevice.cpp @@ -167,7 +167,7 @@ FString TimidityMIDIDevice::GetStats() FString out; int i, used; - CritSec.Enter(); + std::lock_guard lock(CritSec); for (i = used = 0; i < Renderer->voices; ++i) { int status = Renderer->voice[i].status; @@ -205,7 +205,7 @@ FString TimidityMIDIDevice::GetStats() } } } - CritSec.Leave(); + CritSec.unlock(); out.Format(TEXTCOLOR_YELLOW"%3d/%3d ", used, Renderer->voices); out += dots; if (Renderer->cut_notes | Renderer->lost_notes) diff --git a/src/sound/musicformats/music_dumb.cpp b/src/sound/musicformats/music_dumb.cpp index 5ff82f0de..c39bc8385 100644 --- a/src/sound/musicformats/music_dumb.cpp +++ b/src/sound/musicformats/music_dumb.cpp @@ -36,6 +36,7 @@ // HEADER FILES ------------------------------------------------------------ #include +#include #include "i_musicinterns.h" @@ -73,7 +74,7 @@ protected: size_t written; DUH *duh; DUH_SIGRENDERER *sr; - FCriticalSection crit_sec; + std::mutex crit_sec; bool open2(long pos); long render(double volume, double delta, long samples, sample_t **buffer); @@ -957,18 +958,16 @@ bool input_mod::read(SoundStream *stream, void *buffer, int sizebytes, void *use memset(buffer, 0, sizebytes); return false; } - state->crit_sec.Enter(); + std::lock_guard lock(state->crit_sec); while (sizebytes > 0) { int written = state->decode_run(buffer, sizebytes / 8); if (written < 0) { - state->crit_sec.Leave(); return false; } if (written == 0) { - state->crit_sec.Leave(); memset(buffer, 0, sizebytes); return true; } @@ -983,7 +982,6 @@ bool input_mod::read(SoundStream *stream, void *buffer, int sizebytes, void *use buffer = (uint8_t *)buffer + written * 8; sizebytes -= written * 8; } - state->crit_sec.Leave(); return true; } @@ -1063,18 +1061,16 @@ bool input_mod::SetSubsong(int order) { return false; } - crit_sec.Enter(); + std::lock_guard lock(crit_sec); DUH_SIGRENDERER *oldsr = sr; sr = NULL; start_order = order; if (!open2(0)) { sr = oldsr; - crit_sec.Leave(); return false; } duh_end_sigrenderer(oldsr); - crit_sec.Leave(); return true; } diff --git a/src/sound/musicformats/music_gme.cpp b/src/sound/musicformats/music_gme.cpp index 0c1d6d230..19a7b57c2 100644 --- a/src/sound/musicformats/music_gme.cpp +++ b/src/sound/musicformats/music_gme.cpp @@ -39,6 +39,7 @@ #include "i_musicinterns.h" #include +#include #include "v_text.h" #include "templates.h" @@ -56,7 +57,7 @@ public: FString GetStats(); protected: - FCriticalSection CritSec; + std::mutex CritSec; Music_Emu *Emu; gme_info_t *TrackInfo; int SampleRate; @@ -251,12 +252,12 @@ bool GMESong::StartTrack(int track, bool getcritsec) if (getcritsec) { - CritSec.Enter(); + std::lock_guard lock(CritSec); + err = gme_start_track(Emu, track); } - err = gme_start_track(Emu, track); - if (getcritsec) + else { - CritSec.Leave(); + err = gme_start_track(Emu, track); } if (err != NULL) { @@ -356,7 +357,7 @@ bool GMESong::Read(SoundStream *stream, void *buff, int len, void *userdata) gme_err_t err; GMESong *song = (GMESong *)userdata; - song->CritSec.Enter(); + std::lock_guard lock(song->CritSec); if (gme_track_ended(song->Emu)) { if (song->m_Looping) @@ -366,11 +367,9 @@ bool GMESong::Read(SoundStream *stream, void *buff, int len, void *userdata) else { memset(buff, 0, len); - song->CritSec.Leave(); return false; } } err = gme_play(song->Emu, len >> 1, (short *)buff); - song->CritSec.Leave(); return (err == NULL); } diff --git a/src/sound/musicformats/music_libsndfile.cpp b/src/sound/musicformats/music_libsndfile.cpp index e4cd09a42..e0891342f 100644 --- a/src/sound/musicformats/music_libsndfile.cpp +++ b/src/sound/musicformats/music_libsndfile.cpp @@ -34,6 +34,7 @@ // HEADER FILES ------------------------------------------------------------ +#include #include "i_musicinterns.h" #include "v_text.h" #include "templates.h" @@ -53,7 +54,7 @@ public: FString GetStats(); protected: - FCriticalSection CritSec; + std::mutex CritSec; FileReader Reader; SoundDecoder *Decoder; int Channels; @@ -387,7 +388,7 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat { char *buff = (char*)vbuff; SndFileSong *song = (SndFileSong *)userdata; - song->CritSec.Enter(); + std::lock_guard lock(song->CritSec); size_t len = size_t(ilen); size_t currentpos = song->Decoder->getSampleOffset(); @@ -399,7 +400,6 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat if (currentpos == maxpos) { memset(buff, 0, len); - song->CritSec.Leave(); return false; } if (currentpos + framestoread > maxpos) @@ -436,7 +436,6 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat size_t readlen = song->Decoder->read(buff, len); if (readlen == 0) { - song->CritSec.Leave(); return false; } buff += readlen; @@ -447,6 +446,5 @@ bool SndFileSong::Read(SoundStream *stream, void *vbuff, int ilen, void *userdat } } } - song->CritSec.Leave(); return true; } diff --git a/src/sound/oplsynth/opl_mus_player.cpp b/src/sound/oplsynth/opl_mus_player.cpp index 73b2d9bc6..cf4a702d6 100644 --- a/src/sound/oplsynth/opl_mus_player.cpp +++ b/src/sound/oplsynth/opl_mus_player.cpp @@ -67,10 +67,9 @@ OPLmusicBlock::~OPLmusicBlock() void OPLmusicBlock::ResetChips () { - ChipAccess.Enter(); + std::lock_guard lock(ChipAccess); io->Reset (); NumChips = io->Init(MIN(*opl_numchips, 2), FullPan); - ChipAccess.Leave(); } void OPLmusicBlock::Restart() @@ -255,7 +254,7 @@ bool OPLmusicBlock::ServiceStream (void *buff, int numbytes) memset(buff, 0, numbytes); - ChipAccess.Enter(); + std::lock_guard lock(ChipAccess); while (numsamples > 0) { double ticky = NextTickIn; @@ -312,7 +311,6 @@ bool OPLmusicBlock::ServiceStream (void *buff, int numbytes) } } } - ChipAccess.Leave(); return res; } diff --git a/src/sound/oplsynth/opl_mus_player.h b/src/sound/oplsynth/opl_mus_player.h index 17f5521e2..bd6e2612a 100644 --- a/src/sound/oplsynth/opl_mus_player.h +++ b/src/sound/oplsynth/opl_mus_player.h @@ -1,4 +1,4 @@ -#include "critsec.h" +#include #include "musicblock.h" class FileReader; @@ -28,7 +28,7 @@ protected: double LastOffset; bool FullPan; - FCriticalSection ChipAccess; + std::mutex ChipAccess; }; class OPLmusicFile : public OPLmusicBlock diff --git a/src/sound/timiditypp/playmidi.cpp b/src/sound/timiditypp/playmidi.cpp index 4ffa768c8..fa4bd43c1 100644 --- a/src/sound/timiditypp/playmidi.cpp +++ b/src/sound/timiditypp/playmidi.cpp @@ -25,6 +25,7 @@ #include #include +#include #include "timidity.h" #include "common.h" #include "instrum.h" @@ -37,13 +38,12 @@ #include "c_cvars.h" #include "tables.h" #include "effect.h" -#include "critsec.h" #include "i_musicinterns.h" namespace TimidityPlus { - FCriticalSection CvarCritSec; + std::mutex CvarCritSec; bool timidity_modulation_wheel = true; bool timidity_portamento = false; int timidity_reverb = 0; @@ -73,9 +73,8 @@ namespace TimidityPlus template void ChangeVarSync(T&var, T value) { - TimidityPlus::CvarCritSec.Enter(); + std::lock_guard lock(TimidityPlus::CvarCritSec); var = value; - TimidityPlus::CvarCritSec.Leave(); } CUSTOM_CVAR(Bool, timidity_modulation_wheel, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -5128,7 +5127,7 @@ int Player::compute_data(float *buffer, int32_t count) { if (count == 0) return RC_OK; - CvarCritSec.Enter(); + std::lock_guard lock(CvarCritSec); if (last_reverb_setting != timidity_reverb) { @@ -5154,7 +5153,6 @@ int Player::compute_data(float *buffer, int32_t count) *buffer++ = (common_buffer[i])*(5.f / 0x80000000u); } } - CvarCritSec.Leave(); return RC_OK; } diff --git a/src/sound/wildmidi/wildmidi_lib.cpp b/src/sound/wildmidi/wildmidi_lib.cpp index b505d0982..4fdf12cf3 100644 --- a/src/sound/wildmidi/wildmidi_lib.cpp +++ b/src/sound/wildmidi/wildmidi_lib.cpp @@ -36,6 +36,7 @@ #endif #include #include +#include #include "common.h" #include "wm_error.h" @@ -43,7 +44,6 @@ #include "reverb.h" #include "gus_pat.h" #include "wildmidi_lib.h" -#include "critsec.h" #include "files.h" #include "i_soundfont.h" @@ -84,7 +84,7 @@ static int fix_release = 0; static int auto_amp = 0; static int auto_amp_with_amp = 0; -static FCriticalSection patch_lock; +static std::mutex patch_lock; extern std::unique_ptr wm_sfreader; struct _channel { @@ -151,7 +151,7 @@ struct _mdi { reverb = NULL; } - FCriticalSection lock; + std::mutex lock; unsigned long int samples_to_mix; unsigned short midi_master_vol; @@ -179,7 +179,7 @@ static double newt_coeffs[58][58]; /* for start/end of samples */ #define MAX_GAUSS_ORDER 34 /* 34 is as high as we can go before errors crop up */ static double *gauss_table = NULL; /* *gauss_table[1< lock(gauss_lock); if (gauss_table) { - gauss_lock.Leave(); return; } @@ -241,14 +240,13 @@ static void init_gauss(void) { } gauss_table = t; - gauss_lock.Leave(); } -static void free_gauss(void) { - gauss_lock.Enter(); +static void free_gauss(void) +{ + std::lock_guard lock(gauss_lock); free(gauss_table); gauss_table = NULL; - gauss_lock.Leave(); } struct _hndl { @@ -562,7 +560,7 @@ static void WM_FreePatches(void) { struct _patch * tmp_patch; struct _sample * tmp_sample; - patch_lock.Enter(); + std::lock_guard lock(patch_lock); for (i = 0; i < 128; i++) { while (patch[i]) { while (patch[i]->first_sample) { @@ -577,7 +575,6 @@ static void WM_FreePatches(void) { patch[i] = tmp_patch; } } - patch_lock.Leave(); } /* wm_strdup -- adds extra space for appending up to 4 chars */ @@ -1324,27 +1321,23 @@ static struct _patch * get_patch_data(unsigned short patchid) { struct _patch *search_patch; - patch_lock.Enter(); + std::lock_guard lock(patch_lock); search_patch = patch[patchid & 0x007F]; if (search_patch == NULL) { - patch_lock.Leave(); return NULL; } while (search_patch) { if (search_patch->patchid == patchid) { - patch_lock.Leave(); return search_patch; } search_patch = search_patch->next; } if ((patchid >> 8) != 0) { - patch_lock.Leave(); return (get_patch_data(patchid & 0x00FF)); } - patch_lock.Leave(); return NULL; } @@ -1363,16 +1356,14 @@ static void load_patch(struct _mdi *mdi, unsigned short patchid) { return; } - patch_lock.Enter(); + std::lock_guard lock(patch_lock); if (!tmp_patch->loaded) { if (load_sample(tmp_patch) == -1) { - patch_lock.Leave(); return; } } if (tmp_patch->first_sample == NULL) { - patch_lock.Leave(); return; } @@ -1381,7 +1372,6 @@ static void load_patch(struct _mdi *mdi, unsigned short patchid) { (sizeof(struct _patch*) * mdi->patch_count)); mdi->patches[mdi->patch_count - 1] = tmp_patch; tmp_patch->inuse_count++; - patch_lock.Leave(); } static struct _sample * @@ -1389,17 +1379,14 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) { struct _sample *last_sample = NULL; struct _sample *return_sample = NULL; - patch_lock.Enter(); + std::lock_guard lock(patch_lock); if (sample_patch == NULL) { - patch_lock.Leave(); return NULL; } if (sample_patch->first_sample == NULL) { - patch_lock.Leave(); return NULL; } if (freq == 0) { - patch_lock.Leave(); return sample_patch->first_sample; } @@ -1408,7 +1395,6 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) { while (last_sample) { if (freq > last_sample->freq_low) { if (freq < last_sample->freq_high) { - patch_lock.Leave(); return last_sample; } else { return_sample = last_sample; @@ -1416,7 +1402,6 @@ get_sample_data(struct _patch *sample_patch, unsigned long int freq) { } last_sample = last_sample->next; } - patch_lock.Leave(); return return_sample; } @@ -2100,7 +2085,7 @@ static void freeMDI(struct _mdi *mdi) { unsigned long int i; if (mdi->patch_count != 0) { - patch_lock.Enter(); + std::lock_guard lock(patch_lock); for (i = 0; i < mdi->patch_count; i++) { mdi->patches[i]->inuse_count--; if (mdi->patches[i]->inuse_count == 0) { @@ -2114,7 +2099,6 @@ static void freeMDI(struct _mdi *mdi) { mdi->patches[i]->loaded = 0; } } - patch_lock.Leave(); free(mdi->patches); } @@ -2632,7 +2616,7 @@ WM_SYMBOL int WildMidi_Close(midi * handle) { 0); return -1; } - mdi->lock.Enter(); + std::lock_guard lock(mdi->lock); if (first_handle->handle == handle) { tmp_handle = first_handle->next; free(first_handle); @@ -2703,17 +2687,15 @@ WM_SYMBOL int WildMidi_SetOption(midi * handle, unsigned short int options, } mdi = (struct _mdi *) handle; - mdi->lock.Enter(); + std::lock_guard lock(mdi->lock); if ((!(options & 0x0007)) || (options & 0xFFF8)) { _WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid option)", 0); - mdi->lock.Leave(); return -1; } if (setting & 0xFFF8) { _WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_INVALID_ARG, "(invalid setting)", 0); - mdi->lock.Leave(); return -1; } @@ -2727,7 +2709,6 @@ WM_SYMBOL int WildMidi_SetOption(midi * handle, unsigned short int options, _WM_reset_reverb(mdi->reverb); } - mdi->lock.Leave(); return 0; } @@ -2743,12 +2724,11 @@ WildMidi_GetInfo(midi * handle) { 0); return NULL; } - mdi->lock.Enter(); + std::lock_guard lock(mdi->lock); if (mdi->tmp_info == NULL) { mdi->tmp_info = (struct _WM_Info*)malloc(sizeof(struct _WM_Info)); if (mdi->tmp_info == NULL) { _WM_ERROR(__FUNCTION__, __LINE__, WM_ERR_MEM, "to set info", 0); - mdi->lock.Leave(); return NULL; } mdi->tmp_info->copyright = NULL; @@ -2763,7 +2743,6 @@ WildMidi_GetInfo(midi * handle) { } else { mdi->tmp_info->copyright = NULL; } - mdi->lock.Leave(); return mdi->tmp_info; } diff --git a/src/win32/critsec.cpp b/src/win32/critsec.cpp deleted file mode 100644 index 471b19b9f..000000000 --- a/src/win32/critsec.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* -** -** -**--------------------------------------------------------------------------- -** Copyright 2005-2016 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ -// Wraps a Windows critical section object. - -#ifndef _WINNT_ -#define WIN32_LEAN_AND_MEAN -#include -#endif - -class FInternalCriticalSection -{ -public: - FInternalCriticalSection() - { - InitializeCriticalSection(&CritSec); - } - ~FInternalCriticalSection() - { - DeleteCriticalSection(&CritSec); - } - void Enter() - { - EnterCriticalSection(&CritSec); - } - void Leave() - { - LeaveCriticalSection(&CritSec); - } -#if 0 - // SDL has no equivalent functionality, so better not use it on Windows. - bool TryEnter() - { - return TryEnterCriticalSection(&CritSec) != 0; - } -#endif -private: - CRITICAL_SECTION CritSec; -}; - - -FInternalCriticalSection *CreateCriticalSection() -{ - return new FInternalCriticalSection(); -} - -void DeleteCriticalSection(FInternalCriticalSection *c) -{ - delete c; -} - -void EnterCriticalSection(FInternalCriticalSection *c) -{ - c->Enter(); -} - -void LeaveCriticalSection(FInternalCriticalSection *c) -{ - c->Leave(); -}