summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdrian Graber <adrian@adriangraber.com>2021-01-24 14:02:15 +0100
committererorcun <erorcunerorcun@hotmail.com.tr>2021-02-16 16:29:41 +0100
commit48227bd350ab894b11dc362f7f3954bae40776cc (patch)
treead157db0bd4fe55037c702555c2376a75d2a357d /src
parentFix rare stream deadlock on Windows (diff)
downloadre3-48227bd350ab894b11dc362f7f3954bae40776cc.tar
re3-48227bd350ab894b11dc362f7f3954bae40776cc.tar.gz
re3-48227bd350ab894b11dc362f7f3954bae40776cc.tar.bz2
re3-48227bd350ab894b11dc362f7f3954bae40776cc.tar.lz
re3-48227bd350ab894b11dc362f7f3954bae40776cc.tar.xz
re3-48227bd350ab894b11dc362f7f3954bae40776cc.tar.zst
re3-48227bd350ab894b11dc362f7f3954bae40776cc.zip
Diffstat (limited to 'src')
-rw-r--r--src/core/CdStreamPosix.cpp77
1 files changed, 60 insertions, 17 deletions
diff --git a/src/core/CdStreamPosix.cpp b/src/core/CdStreamPosix.cpp
index e18280e5..09611fba 100644
--- a/src/core/CdStreamPosix.cpp
+++ b/src/core/CdStreamPosix.cpp
@@ -12,6 +12,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/resource.h>
+#include <stdarg.h>
#include <sys/syscall.h>
#include "CdStream.h"
@@ -25,6 +26,58 @@
bool flushStream[MAX_CDCHANNELS];
#endif
+#ifdef USE_UNNAMED_SEM
+
+#define RE3_SEM_OPEN(name, ...) re3_sem_open()
+sem_t*
+re3_sem_open(void)
+{
+ sem_t* sem = (sem_t*)malloc(sizeof(sem_t));
+ if (sem_init(sem, 0, 1) == -1) {
+ sem = SEM_FAILED;
+ }
+
+ return sem;
+}
+
+#define RE3_SEM_CLOSE(sem, format, ...) re3_sem_close(sem)
+void
+re3_sem_close(sem_t* sem)
+{
+ sem_destroy(sem);
+ free(sem);
+}
+
+#else
+
+#define RE3_SEM_OPEN re3_sem_open
+sem_t*
+re3_sem_open(const char* format, ...)
+{
+ char semName[20];
+ va_list va;
+ va_start(va, format);
+ vsprintf(semName, format, va);
+
+ return sem_open(semName, O_CREAT, 0644, 1);
+}
+
+#define RE3_SEM_CLOSE re3_sem_close
+void
+re3_sem_close(sem_t* sem, const char* format, ...)
+{
+ sem_close(sem);
+
+ char semName[20];
+ va_list va;
+ va_start(va, format);
+ vsprintf(semName, format, va);
+
+ sem_unlink(semName);
+}
+
+#endif
+
struct CdReadInfo
{
uint32 nSectorOffset;
@@ -69,14 +122,13 @@ void
CdStreamInitThread(void)
{
int status;
- char semName[20];
#ifndef ONE_THREAD_PER_CHANNEL
gChannelRequestQ.items = (int32 *)calloc(gNumChannels + 1, sizeof(int32));
gChannelRequestQ.head = 0;
gChannelRequestQ.tail = 0;
gChannelRequestQ.size = gNumChannels + 1;
ASSERT(gChannelRequestQ.items != nil );
- gCdStreamSema = sem_open("/semaphore_cd_stream", O_CREAT, 0644, 0);
+ gCdStreamSema = RE3_SEM_OPEN("/semaphore_cd_stream");
if (gCdStreamSema == SEM_FAILED) {
@@ -90,8 +142,7 @@ CdStreamInitThread(void)
{
for ( int32 i = 0; i < gNumChannels; i++ )
{
- sprintf(semName,"/semaphore_done%d",i);
- gpReadInfo[i].pDoneSemaphore = sem_open(semName, O_CREAT, 0644, 0);
+ gpReadInfo[i].pDoneSemaphore = RE3_SEM_OPEN("/semaphore_done%d", i);
if (gpReadInfo[i].pDoneSemaphore == SEM_FAILED)
{
@@ -101,8 +152,7 @@ CdStreamInitThread(void)
}
#ifdef ONE_THREAD_PER_CHANNEL
- sprintf(semName,"/semaphore_start%d",i);
- gpReadInfo[i].pStartSemaphore = sem_open(semName, O_CREAT, 0644, 0);
+ gpReadInfo[i].pStartSemaphore = RE3_SEM_OPEN("/semaphore_start%d", i);
if (gpReadInfo[i].pStartSemaphore == SEM_FAILED)
{
@@ -464,21 +514,14 @@ void *CdStreamThread(void *param)
#ifndef ONE_THREAD_PER_CHANNEL
for ( int32 i = 0; i < gNumChannels; i++ )
{
- sem_close(gpReadInfo[i].pDoneSemaphore);
- sprintf(semName,"/semaphore_done%d",i);
- sem_unlink(semName);
+ RE3_SEM_CLOSE(gpReadInfo[i].pDoneSemaphore, "/semaphore_done%d", i);
}
- sem_close(gCdStreamSema);
- sem_unlink("/semaphore_cd_stream");
+ RE3_SEM_CLOSE(gCdStreamSema, "/semaphore_cd_stream");
free(gChannelRequestQ.items);
#else
- sem_close(gpReadInfo[channel].pStartSemaphore);
- sprintf(semName,"/semaphore_start%d",channel);
- sem_unlink(semName);
+ RE3_SEM_CLOSE(gpReadInfo[channel].pStartSemaphore, "/semaphore_start%d", channel);
- sem_close(gpReadInfo[channel].pDoneSemaphore);
- sprintf(semName,"/semaphore_done%d",channel);
- sem_unlink(semName);
+ RE3_SEM_CLOSE(gpReadInfo[channel].pDoneSemaphore, "/semaphore_done%d", channel);
#endif
if (gpReadInfo)
free(gpReadInfo);