[PATCH 2/6] winmm: Protect MIDI stream info with critical section.

Andrew Eikum aeikum at codeweavers.com
Thu May 24 15:10:07 CDT 2018


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Mon, May 21, 2018 at 09:36:10PM +0900, Akihiro Sagawa wrote:
> Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
> ---
>  dlls/winmm/winmm.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 

> diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
> index e0a2360..0933f03 100644
> --- a/dlls/winmm/winmm.c
> +++ b/dlls/winmm/winmm.c
> @@ -912,6 +912,7 @@ typedef struct WINE_MIDIStream {
>      HMIDIOUT			hDevice;
>      HANDLE			hThread;
>      DWORD			dwThreadID;
> +    CRITICAL_SECTION		lock;
>      DWORD			dwTempo;
>      DWORD			dwTimeDiv;
>      DWORD			dwPositionMS;
> @@ -1140,8 +1141,10 @@ start_header:
>  
>  	/* do we have to wait ? */
>  	if (me->dwDeltaTime) {
> +	    EnterCriticalSection(&lpMidiStrm->lock);
>  	    lpMidiStrm->dwPositionMS += MMSYSTEM_MidiStream_Convert(lpMidiStrm, me->dwDeltaTime);
>  	    lpMidiStrm->dwPulses += me->dwDeltaTime;
> +	    LeaveCriticalSection(&lpMidiStrm->lock);
>  
>  	    dwToGo = lpMidiStrm->dwStartTicks + lpMidiStrm->dwPositionMS;
>  
> @@ -1185,7 +1188,9 @@ start_header:
>  	    midiOutShortMsg(lpMidiStrm->hDevice, MEVT_EVENTPARM(me->dwEvent));
>  	    break;
>  	case MEVT_TEMPO:
> +	    EnterCriticalSection(&lpMidiStrm->lock);
>  	    lpMidiStrm->dwTempo = MEVT_EVENTPARM(me->dwEvent);
> +	    LeaveCriticalSection(&lpMidiStrm->lock);
>  	    break;
>  	case MEVT_VERSION:
>  	    break;
> @@ -1248,8 +1253,11 @@ MMRESULT WINAPI midiStreamClose(HMIDISTRM hMidiStrm)
>      DriverCallback(lpwm->mod.dwCallback, lpMidiStrm->wFlags,
>                     (HDRVR)lpMidiStrm->hDevice, MM_MOM_CLOSE,
>                     lpwm->mod.dwInstance, 0, 0);
> -    if(!ret)
> +    if(!ret) {
> +        lpMidiStrm->lock.DebugInfo->Spare[0] = 0;
> +        DeleteCriticalSection(&lpMidiStrm->lock);
>          HeapFree(GetProcessHeap(), 0, lpMidiStrm);
> +    }
>  
>      return midiOutClose((HMIDIOUT)hMidiStrm);
>  }
> @@ -1306,6 +1314,9 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
>  	return ret;
>      }
>  
> +    InitializeCriticalSection(&lpMidiStrm->lock);
> +    lpMidiStrm->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": WINMM_MidiStream.lock");
> +
>      lpMidiStrm->hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
>      lpMidiStrm->wFlags = HIWORD(fdwOpen);
>  
> @@ -1402,6 +1413,7 @@ MMRESULT WINAPI midiStreamPosition(HMIDISTRM hMidiStrm, LPMMTIME lpMMT, UINT cbm
>      } else if (lpMMT == NULL || cbmmt != sizeof(MMTIME)) {
>  	ret = MMSYSERR_INVALPARAM;
>      } else {
> +	EnterCriticalSection(&lpMidiStrm->lock);
>  	switch (lpMMT->wType) {
>  	default:
>  	    FIXME("Unsupported time type %x\n", lpMMT->wType);
> @@ -1419,6 +1431,7 @@ MMRESULT WINAPI midiStreamPosition(HMIDISTRM hMidiStrm, LPMMTIME lpMMT, UINT cbm
>  	    TRACE("=> %d ticks\n", lpMMT->u.ticks);
>  	    break;
>  	}
> +	LeaveCriticalSection(&lpMidiStrm->lock);
>      }
>      return ret;
>  }
> @@ -1440,6 +1453,7 @@ MMRESULT WINAPI midiStreamProperty(HMIDISTRM hMidiStrm, LPBYTE lpPropData, DWORD
>      } else if (dwProperty & MIDIPROP_TEMPO) {
>  	MIDIPROPTEMPO*	mpt = (MIDIPROPTEMPO*)lpPropData;
>  
> +	EnterCriticalSection(&lpMidiStrm->lock);
>  	if (sizeof(MIDIPROPTEMPO) != mpt->cbStruct) {
>  	    ret = MMSYSERR_INVALPARAM;
>  	} else if (dwProperty & MIDIPROP_SET) {
> @@ -1449,13 +1463,16 @@ MMRESULT WINAPI midiStreamProperty(HMIDISTRM hMidiStrm, LPBYTE lpPropData, DWORD
>  	    mpt->dwTempo = lpMidiStrm->dwTempo;
>  	    TRACE("Getting tempo <= %d\n", mpt->dwTempo);
>  	}
> +	LeaveCriticalSection(&lpMidiStrm->lock);
>      } else if (dwProperty & MIDIPROP_TIMEDIV) {
>  	MIDIPROPTIMEDIV*	mptd = (MIDIPROPTIMEDIV*)lpPropData;
>  
>  	if (sizeof(MIDIPROPTIMEDIV) != mptd->cbStruct) {
>  	    ret = MMSYSERR_INVALPARAM;
>  	} else if (dwProperty & MIDIPROP_SET) {
> +	    EnterCriticalSection(&lpMidiStrm->lock);
>  	    lpMidiStrm->dwTimeDiv = mptd->dwTimeDiv;
> +	    LeaveCriticalSection(&lpMidiStrm->lock);
>  	    TRACE("Setting time div to %d\n", mptd->dwTimeDiv);
>  	} else if (dwProperty & MIDIPROP_GET) {
>  	    mptd->dwTimeDiv = lpMidiStrm->dwTimeDiv;

> 




More information about the wine-devel mailing list