ntdll: Use a pthread mutex for the CD-ROM cache section.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
fdb09f4523
commit
992bdd77a0
|
@ -298,14 +298,7 @@ struct cdrom_cache {
|
|||
#define MAX_CACHE_ENTRIES 5
|
||||
static struct cdrom_cache cdrom_cache[MAX_CACHE_ENTRIES];
|
||||
|
||||
static RTL_CRITICAL_SECTION cache_section;
|
||||
static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
|
||||
{
|
||||
0, 0, &cache_section,
|
||||
{ &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
|
||||
0, 0, { (DWORD_PTR)(__FILE__ ": cache_section") }
|
||||
};
|
||||
static RTL_CRITICAL_SECTION cache_section = { &critsect_debug, -1, 0, 0, 0, 0 };
|
||||
static pthread_mutex_t cache_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
/* Proposed media change function: not really needed at this time */
|
||||
/* This is a 1 or 0 type of function */
|
||||
|
@ -566,9 +559,9 @@ static NTSTATUS CDROM_SyncCache(int dev, int fd)
|
|||
|
||||
static void CDROM_ClearCacheEntry(int dev)
|
||||
{
|
||||
RtlEnterCriticalSection( &cache_section );
|
||||
pthread_mutex_lock( &cache_mutex );
|
||||
cdrom_cache[dev].toc_good = 0;
|
||||
RtlLeaveCriticalSection( &cache_section );
|
||||
pthread_mutex_unlock( &cache_mutex );
|
||||
}
|
||||
|
||||
|
||||
|
@ -674,7 +667,7 @@ static NTSTATUS CDROM_Open(int fd, int* dev)
|
|||
|
||||
if (fstat(fd, &st) == -1) return errno_to_status( errno );
|
||||
|
||||
RtlEnterCriticalSection( &cache_section );
|
||||
pthread_mutex_lock( &cache_mutex );
|
||||
for (*dev = 0; *dev < MAX_CACHE_ENTRIES; (*dev)++)
|
||||
{
|
||||
if (empty == -1 &&
|
||||
|
@ -695,7 +688,7 @@ static NTSTATUS CDROM_Open(int fd, int* dev)
|
|||
cdrom_cache[*dev].inode = st.st_ino;
|
||||
}
|
||||
}
|
||||
RtlLeaveCriticalSection( &cache_section );
|
||||
pthread_mutex_unlock( &cache_mutex );
|
||||
|
||||
TRACE("%d, %d\n", *dev, fd);
|
||||
return ret;
|
||||
|
@ -847,13 +840,13 @@ static NTSTATUS CDROM_ReadTOC(int dev, int fd, CDROM_TOC* toc)
|
|||
if (dev < 0 || dev >= MAX_CACHE_ENTRIES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
RtlEnterCriticalSection( &cache_section );
|
||||
pthread_mutex_lock( &cache_mutex );
|
||||
if (cdrom_cache[dev].toc_good || !(ret = CDROM_SyncCache(dev, fd)))
|
||||
{
|
||||
*toc = cdrom_cache[dev].toc;
|
||||
ret = STATUS_SUCCESS;
|
||||
}
|
||||
RtlLeaveCriticalSection( &cache_section );
|
||||
pthread_mutex_unlock( &cache_mutex );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -933,7 +926,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA
|
|||
switch (fmt->Format)
|
||||
{
|
||||
case IOCTL_CDROM_CURRENT_POSITION:
|
||||
RtlEnterCriticalSection( &cache_section );
|
||||
pthread_mutex_lock( &cache_mutex );
|
||||
if (hdr->AudioStatus==AUDIO_STATUS_IN_PROGRESS) {
|
||||
data->CurrentPosition.FormatCode = IOCTL_CDROM_CURRENT_POSITION;
|
||||
data->CurrentPosition.Control = sc.cdsc_ctrl;
|
||||
|
@ -958,7 +951,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA
|
|||
cdrom_cache[dev].CurrentPosition.Header = *hdr; /* Preserve header info */
|
||||
data->CurrentPosition = cdrom_cache[dev].CurrentPosition;
|
||||
}
|
||||
RtlLeaveCriticalSection( &cache_section );
|
||||
pthread_mutex_unlock( &cache_mutex );
|
||||
break;
|
||||
case IOCTL_CDROM_MEDIA_CATALOG:
|
||||
data->MediaCatalog.FormatCode = IOCTL_CDROM_MEDIA_CATALOG;
|
||||
|
@ -1044,7 +1037,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA
|
|||
switch (fmt->Format)
|
||||
{
|
||||
case IOCTL_CDROM_CURRENT_POSITION:
|
||||
RtlEnterCriticalSection( &cache_section );
|
||||
pthread_mutex_lock( &cache_mutex );
|
||||
if (hdr->AudioStatus==AUDIO_STATUS_IN_PROGRESS) {
|
||||
data->CurrentPosition.FormatCode = IOCTL_CDROM_CURRENT_POSITION;
|
||||
data->CurrentPosition.Control = sc.what.position.control;
|
||||
|
@ -1066,7 +1059,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA
|
|||
cdrom_cache[dev].CurrentPosition.Header = *hdr; /* Preserve header info */
|
||||
data->CurrentPosition = cdrom_cache[dev].CurrentPosition;
|
||||
}
|
||||
RtlLeaveCriticalSection( &cache_section );
|
||||
pthread_mutex_unlock( &cache_mutex );
|
||||
break;
|
||||
case IOCTL_CDROM_MEDIA_CATALOG:
|
||||
data->MediaCatalog.FormatCode = IOCTL_CDROM_MEDIA_CATALOG;
|
||||
|
@ -1255,7 +1248,7 @@ static NTSTATUS CDROM_SeekAudioMSF(int dev, int fd, const CDROM_SEEK_AUDIO_MSF*
|
|||
if (i <= toc.FirstTrack || i > toc.LastTrack+1)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
i--;
|
||||
RtlEnterCriticalSection( &cache_section );
|
||||
pthread_mutex_lock( &cache_mutex );
|
||||
cp = &cdrom_cache[dev].CurrentPosition;
|
||||
cp->FormatCode = IOCTL_CDROM_CURRENT_POSITION;
|
||||
cp->Control = toc.TrackData[i-toc.FirstTrack].Control;
|
||||
|
@ -1269,7 +1262,7 @@ static NTSTATUS CDROM_SeekAudioMSF(int dev, int fd, const CDROM_SEEK_AUDIO_MSF*
|
|||
frame -= FRAME_OF_TOC(toc,i);
|
||||
cp->TrackRelativeAddress[0] = 0;
|
||||
MSF_OF_FRAME(cp->TrackRelativeAddress[1], frame);
|
||||
RtlLeaveCriticalSection( &cache_section );
|
||||
pthread_mutex_unlock( &cache_mutex );
|
||||
|
||||
/* If playing, then issue a seek command, otherwise do nothing */
|
||||
#ifdef linux
|
||||
|
|
Loading…
Reference in New Issue