summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-08-09 02:22:57 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-08-09 02:22:57 +0000
commitd4840a37d9adf0b9124fad722a5ae5faae4bb639 (patch)
treeadb29427193a551e14fc6bd3d8aacfecf8706746 /plugins
parent511edc3388bb3b8285af8c818af27235773d4bce (diff)
downloadpcsxr-d4840a37d9adf0b9124fad722a5ae5faae4bb639.tar.gz
dfcdrom: fixed thread deadlock in some cases.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@55905 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins')
-rw-r--r--plugins/dfcdrom/cdr.c55
-rw-r--r--plugins/dfcdrom/cdr.h1
-rw-r--r--plugins/dfnet/cfg.c1
3 files changed, 36 insertions, 21 deletions
diff --git a/plugins/dfcdrom/cdr.c b/plugins/dfcdrom/cdr.c
index f011684d..9399f501 100644
--- a/plugins/dfcdrom/cdr.c
+++ b/plugins/dfcdrom/cdr.c
@@ -32,9 +32,10 @@ int initial_time = 0;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-CacheData *cdcache;
-unsigned char *cdbuffer;
-int cacheaddr;
+volatile CacheData *cdcache;
+volatile int cacheaddr;
+
+volatile unsigned char *cdbuffer;
crdata cr;
@@ -85,7 +86,7 @@ long CDRopen(void) {
if (ReadMode == THREADED) {
cdcache = (CacheData *)malloc(CacheSize * sizeof(CacheData));
if (cdcache == NULL) return -1;
- memset(cdcache, 0, CacheSize * sizeof(CacheData));
+ memset((void *)cdcache, 0, CacheSize * sizeof(CacheData));
found = 0;
} else {
@@ -136,7 +137,7 @@ long CDRclose(void) {
}
if (ReadMode == THREADED) {
- free(cdcache);
+ free((void *)cdcache);
}
return 0;
@@ -190,8 +191,8 @@ long ReadNormal() {
return 0;
}
-unsigned char* GetBNormal() {
- return cdbuffer;
+unsigned char *GetBNormal() {
+ return (unsigned char *)cdbuffer;
}
// threaded reading (with cache)
@@ -203,16 +204,16 @@ long ReadThreaded() {
i = addr - cacheaddr;
PRINTF("found %d\n", (addr - cacheaddr));
cdbuffer = cdcache[i].cr.buf + 12;
- while (btoi(cdbuffer[0]) != cr.msf.cdmsf_min0 ||
- btoi(cdbuffer[1]) != cr.msf.cdmsf_sec0 ||
- btoi(cdbuffer[2]) != cr.msf.cdmsf_frame0) {
+ while (cdcache[i].msf[0] != cr.msf.cdmsf_min0 ||
+ cdcache[i].msf[1] != cr.msf.cdmsf_sec0 ||
+ cdcache[i].msf[2] != cr.msf.cdmsf_frame0) {
if (locked == 1) {
if (cdcache[i].ret == 0) break;
return -1;
}
usleep(5000);
}
- PRINTF("%x:%x:%x, %p, %p\n", cdbuffer[0], cdbuffer[1], cdbuffer[2], cdbuffer, cdcache);
+ PRINTF("%d:%d:%d, %p, %p\n", cdcache[i].msf[0], cdcache[i].msf[1], cdcache[i].msf[2], cdbuffer, cdcache);
found = 1;
return 0;
@@ -226,6 +227,7 @@ long ReadThreaded() {
// not found in cache
locked = 0;
+
pthread_mutex_lock(&mut);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mut);
@@ -233,20 +235,22 @@ long ReadThreaded() {
return 0;
}
-unsigned char* GetBThreaded() {
+unsigned char *GetBThreaded() {
PRINTF("threadc %d\n", found);
- if (found == 1) return cdbuffer;
+ if (found == 1) return (unsigned char *)cdbuffer;
+
cdbuffer = cdcache[0].cr.buf + 12;
- while (btoi(cdbuffer[0]) != cr.msf.cdmsf_min0 ||
- btoi(cdbuffer[1]) != cr.msf.cdmsf_sec0 ||
- btoi(cdbuffer[2]) != cr.msf.cdmsf_frame0) {
+
+ while (cdcache[0].msf[0] != cr.msf.cdmsf_min0 ||
+ cdcache[0].msf[1] != cr.msf.cdmsf_sec0 ||
+ cdcache[0].msf[2] != cr.msf.cdmsf_frame0) {
if (locked == 1) return NULL;
usleep(5000);
}
if (cdcache[0].ret == -1) return NULL;
- return cdbuffer;
+ return (unsigned char *)cdbuffer;
}
void *CdrThread(void *arg) {
@@ -254,8 +258,9 @@ void *CdrThread(void *arg) {
int i;
for (;;) {
- locked = 1;
pthread_mutex_lock(&mut);
+ locked = 1;
+
pthread_cond_wait(&cond, &mut);
if (stopth == 2) pthread_exit(NULL);
@@ -267,13 +272,21 @@ void *CdrThread(void *arg) {
PRINTF("start thc %d:%d:%d\n", curTime[0], curTime[1], curTime[2]);
for (i = 0; i < CacheSize; i++) {
- memcpy(&cdcache[i].cr.msf, curTime, 3);
+ cdcache[i].cr.msf.cdmsf_min0 = curTime[0];
+ cdcache[i].cr.msf.cdmsf_sec0 = curTime[1];
+ cdcache[i].cr.msf.cdmsf_frame0 = curTime[2];
+
PRINTF("reading %d:%d:%d\n", curTime[0], curTime[1], curTime[2]);
- cdcache[i].ret = ReadSector(&cdcache[i].cr);
- PRINTF("readed %x:%x:%x\n", cdcache[i].cr.buf[12], cdcache[i].cr.buf[13], cdcache[i].cr.buf[14]);
+ cdcache[i].ret = ReadSector((crdata *)&cdcache[i].cr);
if (cdcache[i].ret == -1) break;
+ PRINTF("readed %x:%x:%x\n", cdcache[i].cr.buf[12], cdcache[i].cr.buf[13], cdcache[i].cr.buf[14]);
+
+ cdcache[i].msf[0] = curTime[0];
+ cdcache[i].msf[1] = curTime[1];
+ cdcache[i].msf[2] = curTime[2];
+
curTime[2]++;
if (curTime[2] == 75) {
curTime[2] = 0;
diff --git a/plugins/dfcdrom/cdr.h b/plugins/dfcdrom/cdr.h
index 0ae2c680..88291dca 100644
--- a/plugins/dfcdrom/cdr.h
+++ b/plugins/dfcdrom/cdr.h
@@ -175,6 +175,7 @@ typedef union {
} crdata;
typedef struct {
+ unsigned char msf[3];
crdata cr;
int ret;
} CacheData;
diff --git a/plugins/dfnet/cfg.c b/plugins/dfnet/cfg.c
index a63b074b..921efbe3 100644
--- a/plugins/dfnet/cfg.c
+++ b/plugins/dfnet/cfg.c
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "dfnet.h"