[PATCH 4/5] wineoss: Move the midi in buffer lock to the unixlib.

Andrew Eikum aeikum at codeweavers.com
Tue Apr 26 09:09:17 CDT 2022


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

On Tue, Apr 26, 2022 at 07:28:01AM +0100, Huw Davies wrote:
> The syscall itself is temporary.
> 
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/wineoss.drv/midi.c    | 31 ++++++++++++++++---------------
>  dlls/wineoss.drv/oss.c     |  1 +
>  dlls/wineoss.drv/ossmidi.c | 21 +++++++++++++++++++++
>  dlls/wineoss.drv/unixlib.h |  2 ++
>  4 files changed, 40 insertions(+), 15 deletions(-)
> 
> diff --git a/dlls/wineoss.drv/midi.c b/dlls/wineoss.drv/midi.c
> index 46a0f03e819..4f9e6b3c6f9 100644
> --- a/dlls/wineoss.drv/midi.c
> +++ b/dlls/wineoss.drv/midi.c
> @@ -70,15 +70,6 @@ static	int 		MIDM_NumDevs = 0;
>  
>  static	int		numStartedMidiIn = 0;
>  
> -static CRITICAL_SECTION crit_sect;   /* protects all MidiIn buffers queues */
> -static CRITICAL_SECTION_DEBUG critsect_debug =
> -{
> -    0, 0, &crit_sect,
> -    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
> -      0, 0, { (DWORD_PTR)(__FILE__ ": crit_sect") }
> -};
> -static CRITICAL_SECTION crit_sect = { &critsect_debug, -1, 0, 0, 0, 0 };
> -
>  static int end_thread;
>  static HANDLE hThread;
>  
> @@ -135,6 +126,16 @@ static LRESULT OSS_MidiExit(void)
>      return 0;
>  }
>  
> +static void in_buffer_lock(void)
> +{
> +    OSS_CALL(midi_in_lock, ULongToPtr(1));
> +}
> +
> +static void in_buffer_unlock(void)
> +{
> +    OSS_CALL(midi_in_lock, ULongToPtr(0));
> +}
> +
>  static void notify_client(struct notify_context *notify)
>  {
>      TRACE("dev_id = %d msg = %d param1 = %04lX param2 = %04lX\n",
> @@ -231,7 +232,7 @@ static void midReceiveChar(WORD wDevID, unsigned char value, DWORD dwTime)
>  	LPMIDIHDR	lpMidiHdr;
>          BOOL            sbfb = FALSE;
>  
> -	EnterCriticalSection(&crit_sect);
> +	in_buffer_lock();
>  	if ((lpMidiHdr = MidiInDev[wDevID].lpQueueHdr) != NULL) {
>  	    LPBYTE	lpData = (LPBYTE) lpMidiHdr->lpData;
>  
> @@ -251,7 +252,7 @@ static void midReceiveChar(WORD wDevID, unsigned char value, DWORD dwTime)
>  	    lpMidiHdr->dwFlags |= MHDR_DONE;
>  	    MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD_PTR)lpMidiHdr, dwTime);
>  	}
> -	LeaveCriticalSection(&crit_sect);
> +	in_buffer_unlock();
>  	return;
>      }
>  
> @@ -505,7 +506,7 @@ static DWORD midAddBuffer(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
>      if (lpMidiHdr->dwFlags & MHDR_INQUEUE) return MIDIERR_STILLPLAYING;
>      if (!(lpMidiHdr->dwFlags & MHDR_PREPARED)) return MIDIERR_UNPREPARED;
>  
> -    EnterCriticalSection(&crit_sect);
> +    in_buffer_lock();
>      lpMidiHdr->dwFlags &= ~WHDR_DONE;
>      lpMidiHdr->dwFlags |= MHDR_INQUEUE;
>      lpMidiHdr->dwBytesRecorded = 0;
> @@ -520,7 +521,7 @@ static DWORD midAddBuffer(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
>  	     ptr = ptr->lpNext);
>  	ptr->lpNext = lpMidiHdr;
>      }
> -    LeaveCriticalSection(&crit_sect);
> +    in_buffer_unlock();
>  
>      return MMSYSERR_NOERROR;
>  }
> @@ -537,7 +538,7 @@ static DWORD midReset(WORD wDevID)
>      if (wDevID >= MIDM_NumDevs) return MMSYSERR_BADDEVICEID;
>      if (MidiInDev[wDevID].state == -1) return MIDIERR_NODEVICE;
>  
> -    EnterCriticalSection(&crit_sect);
> +    in_buffer_lock();
>      while (MidiInDev[wDevID].lpQueueHdr) {
>  	LPMIDIHDR lpMidiHdr = MidiInDev[wDevID].lpQueueHdr;
>  	MidiInDev[wDevID].lpQueueHdr = lpMidiHdr->lpNext;
> @@ -545,7 +546,7 @@ static DWORD midReset(WORD wDevID)
>  	lpMidiHdr->dwFlags |= MHDR_DONE;
>  	MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD_PTR)lpMidiHdr, dwTime);
>      }
> -    LeaveCriticalSection(&crit_sect);
> +    in_buffer_unlock();
>  
>      return MMSYSERR_NOERROR;
>  }
> diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
> index aab7c5a32d6..a9081f2cac9 100644
> --- a/dlls/wineoss.drv/oss.c
> +++ b/dlls/wineoss.drv/oss.c
> @@ -1410,4 +1410,5 @@ unixlib_entry_t __wine_unix_call_funcs[] =
>      midi_in_message,
>  
>      midi_seq_open,
> +    midi_in_lock,
>  };
> diff --git a/dlls/wineoss.drv/ossmidi.c b/dlls/wineoss.drv/ossmidi.c
> index f9c34943c46..2f75c4aa773 100644
> --- a/dlls/wineoss.drv/ossmidi.c
> +++ b/dlls/wineoss.drv/ossmidi.c
> @@ -37,6 +37,7 @@
>  #include <fcntl.h>
>  #include <sys/ioctl.h>
>  #include <sys/soundcard.h>
> +#include <pthread.h>
>  
>  #include "ntstatus.h"
>  #define WIN32_NO_STATUS
> @@ -59,6 +60,8 @@ struct midi_dest
>      int                 fd;
>  };
>  
> +static pthread_mutex_t in_buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
> +
>  static unsigned int num_dests, num_srcs, num_synths, seq_refs;
>  static struct midi_dest dests[MAX_MIDIOUTDRV];
>  static struct midi_src srcs[MAX_MIDIINDRV];
> @@ -134,6 +137,24 @@ static int oss_to_win_device_type(int type)
>      }
>  }
>  
> +static void in_buffer_lock(void)
> +{
> +    pthread_mutex_lock(&in_buffer_mutex);
> +}
> +
> +static void in_buffer_unlock(void)
> +{
> +    pthread_mutex_unlock(&in_buffer_mutex);
> +}
> +
> +NTSTATUS midi_in_lock(void *args)
> +{
> +    if (args) in_buffer_lock();
> +    else in_buffer_unlock();
> +
> +    return STATUS_SUCCESS;
> +}
> +
>  static int seq_open(void)
>  {
>      static int midi_warn = 1;
> diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
> index c86bc3450df..544a462dcc4 100644
> --- a/dlls/wineoss.drv/unixlib.h
> +++ b/dlls/wineoss.drv/unixlib.h
> @@ -302,12 +302,14 @@ enum oss_funcs
>      oss_midi_in_message,
>  
>      oss_midi_seq_open, /* temporary */
> +    oss_midi_in_lock,
>  };
>  
>  NTSTATUS midi_init(void *args) DECLSPEC_HIDDEN;
>  NTSTATUS midi_out_message(void *args) DECLSPEC_HIDDEN;
>  NTSTATUS midi_in_message(void *args) DECLSPEC_HIDDEN;
>  NTSTATUS midi_seq_open(void *args) DECLSPEC_HIDDEN;
> +NTSTATUS midi_in_lock(void *args) DECLSPEC_HIDDEN;
>  
>  extern unixlib_handle_t oss_handle;
>  
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list