- removed FCriticalSection and replaced all of its uses with std::mutex.

There's really no need for a non-standard solution here anymore with C++11.
This also fixes an unreleased lock in the WildMidi code.
This commit is contained in:
Christoph Oelckers 2019-02-22 20:24:24 +01:00
parent 3d9dce0156
commit e091369a38
16 changed files with 45 additions and 402 deletions

View file

@ -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

View file

@ -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;
};

View file

@ -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 <pthread.h>
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();
}

View file

@ -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();
}

View file

@ -1,4 +1,5 @@
#include <mutex>
#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;

View file

@ -644,7 +644,7 @@ FString FluidSynthMIDIDevice::GetStats()
}
FString out;
CritSec.Enter();
std::lock_guard<std::mutex> 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 "

View file

@ -237,9 +237,8 @@ void SoftSynthMIDIDevice::Stop()
int SoftSynthMIDIDevice::StreamOutSync(MidiHeader *header)
{
CritSec.Enter();
std::lock_guard<std::mutex> 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<std::mutex> 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;
}

View file

@ -167,7 +167,7 @@ FString TimidityMIDIDevice::GetStats()
FString out;
int i, used;
CritSec.Enter();
std::lock_guard<std::mutex> 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)

View file

@ -36,6 +36,7 @@
// HEADER FILES ------------------------------------------------------------
#include <math.h>
#include <mutex>
#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<std::mutex> 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<std::mutex> 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;
}

View file

@ -39,6 +39,7 @@
#include "i_musicinterns.h"
#include <gme/gme.h>
#include <mutex>
#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<std::mutex> 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<std::mutex> 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);
}

View file

@ -34,6 +34,7 @@
// HEADER FILES ------------------------------------------------------------
#include <mutex>
#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<std::mutex> 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;
}

View file

@ -67,10 +67,9 @@ OPLmusicBlock::~OPLmusicBlock()
void OPLmusicBlock::ResetChips ()
{
ChipAccess.Enter();
std::lock_guard<std::mutex> 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<std::mutex> lock(ChipAccess);
while (numsamples > 0)
{
double ticky = NextTickIn;
@ -312,7 +311,6 @@ bool OPLmusicBlock::ServiceStream (void *buff, int numbytes)
}
}
}
ChipAccess.Leave();
return res;
}

View file

@ -1,4 +1,4 @@
#include "critsec.h"
#include <mutex>
#include "musicblock.h"
class FileReader;
@ -28,7 +28,7 @@ protected:
double LastOffset;
bool FullPan;
FCriticalSection ChipAccess;
std::mutex ChipAccess;
};
class OPLmusicFile : public OPLmusicBlock

View file

@ -25,6 +25,7 @@
#include <string.h>
#include <math.h>
#include <mutex>
#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<class T> void ChangeVarSync(T&var, T value)
{
TimidityPlus::CvarCritSec.Enter();
std::lock_guard<std::mutex> 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<std::mutex> 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;
}

View file

@ -36,6 +36,7 @@
#endif
#include <stdlib.h>
#include <memory>
#include <mutex>
#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<FSoundFontReader> 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<<FPBITS] */
static int gauss_n = MAX_GAUSS_ORDER;
static FCriticalSection gauss_lock;
static std::mutex gauss_lock;
static void init_gauss(void) {
/* init gauss table */
@ -192,9 +192,8 @@ static void init_gauss(void) {
double z[35];
double *gptr, *t;
gauss_lock.Enter();
std::lock_guard<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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;
}

View file

@ -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 <windows.h>
#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();
}