From: Michael R. <mr...@us...> - 2002-09-27 13:07:46
|
Update of /cvsroot/xine/xine-lib/src/dxr3 In directory usw-pr-cvs1:/tmp/cvs-serv26096/src/dxr3 Modified Files: dxr3_decode_spu.c video_out_dxr3.c Log Message: fix deadlock in concurrent access (dvd spus vs. osd overlays) on spu device Index: dxr3_decode_spu.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/dxr3/dxr3_decode_spu.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- dxr3_decode_spu.c 18 Sep 2002 15:42:10 -0000 1.19 +++ dxr3_decode_spu.c 27 Sep 2002 13:07:43 -0000 1.20 @@ -184,19 +184,26 @@ int i; pthread_mutex_lock(&this->dxr3_vo->spu_device_lock); - /* open dxr3 spu device */ - snprintf(tmpstr, sizeof(tmpstr), "%s_sp%s", this->devname, this->devnum); - if ((this->fd_spu = open(tmpstr, O_WRONLY)) < 0) { - printf("dxr3_decode_spu: Failed to open spu device %s (%s)\n", - tmpstr, strerror(errno)); - return; - } + + if (this->dxr3_vo->fd_spu) + this->fd_spu = this->dxr3_vo->fd_spu; + else { + /* open dxr3 spu device */ + snprintf(tmpstr, sizeof(tmpstr), "%s_sp%s", this->devname, this->devnum); + if ((this->fd_spu = open(tmpstr, O_WRONLY)) < 0) { + printf("dxr3_decode_spu: Failed to open spu device %s (%s)\n", + tmpstr, strerror(errno)); + pthread_mutex_unlock(&this->dxr3_vo->spu_device_lock); + return; + } #if LOG_SPU - printf ("dxr3_decode_spu: init: SPU_FD = %i\n",this->fd_spu); + printf ("dxr3_decode_spu: init: SPU_FD = %i\n",this->fd_spu); #endif - /* We are talking directly to the dxr3 video out to allow concurrent - * access to the same spu device */ - this->dxr3_vo->fd_spu = this->fd_spu; + /* We are talking directly to the dxr3 video out to allow concurrent + * access to the same spu device */ + this->dxr3_vo->fd_spu = this->fd_spu; + } + pthread_mutex_unlock(&this->dxr3_vo->spu_device_lock); for (i=0; i < MAX_SPU_STREAMS; i++) { Index: video_out_dxr3.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/dxr3/video_out_dxr3.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- video_out_dxr3.c 20 Sep 2002 12:51:58 -0000 1.55 +++ video_out_dxr3.c 27 Sep 2002 13:07:43 -0000 1.56 @@ -665,6 +665,8 @@ dxr3_spu_encode(this->spu_enc); + pthread_mutex_lock(&this->spu_device_lock); + /* try to open the dxr3 spu device */ if (!this->fd_spu) { snprintf (tmpstr, sizeof(tmpstr), "%s_sp%s", this->devname, this->devnum); @@ -672,11 +674,10 @@ printf("video_out_dxr3: Failed to open spu device %s (%s)\n", tmpstr, strerror(errno)); printf("video_out_dxr3: Overlays are not available\n"); + pthread_mutex_unlock(&this->spu_device_lock); return; } } - - pthread_mutex_lock(&this->spu_device_lock); if (!this->spu_enc->overlay) { uint8_t empty_spu[] = { |