summaryrefslogtreecommitdiff
path: root/src/xine-engine/buffer.c
diff options
context:
space:
mode:
authorGuenter Bartsch <guenter@users.sourceforge.net>2001-08-12 15:12:54 +0000
committerGuenter Bartsch <guenter@users.sourceforge.net>2001-08-12 15:12:54 +0000
commit9c7fc92c6c391b037393721dbe8742ddd260b1d1 (patch)
tree509e00c37b99b8450bd2d8bbc02a25179b60b9f8 /src/xine-engine/buffer.c
parentd831b53279b0814ace01fc1d82bded5a73bb856c (diff)
downloadxine-lib-9c7fc92c6c391b037393721dbe8742ddd260b1d1.tar.gz
xine-lib-9c7fc92c6c391b037393721dbe8742ddd260b1d1.tar.bz2
cancel demux thread on xine_stop instead of pthread_join to prevent hang
CVS patchset: 415 CVS date: 2001/08/12 15:12:54
Diffstat (limited to 'src/xine-engine/buffer.c')
-rw-r--r--src/xine-engine/buffer.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/xine-engine/buffer.c b/src/xine-engine/buffer.c
index a05660fb2..fff308399 100644
--- a/src/xine-engine/buffer.c
+++ b/src/xine-engine/buffer.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: buffer.c,v 1.5 2001/07/03 21:25:04 guenter Exp $
+ * $Id: buffer.c,v 1.6 2001/08/12 15:12:54 guenter Exp $
*
*
* contents:
@@ -59,13 +59,31 @@ static void buffer_pool_free (buf_element_t *element) {
pthread_mutex_unlock (&this->buffer_pool_mutex);
}
+/*
+ * helper function to release buffer pool lock
+ * in case demux thread is cancelled
+ */
+
+void pool_release_lock (void *arg) {
+
+ pthread_mutex_t *mutex = (pthread_mutex_t *) arg;
+
+ /* printf ("pool release lock\n"); */
+
+ pthread_mutex_unlock (mutex);
+
+}
+
/*
- * check if there are no more free elements
+ * allocate a buffer from buffer pool
*/
+
static buf_element_t *buffer_pool_alloc (fifo_buffer_t *this) {
buf_element_t *buf;
+ pthread_cleanup_push( pool_release_lock, &this->buffer_pool_mutex);
+
pthread_mutex_lock (&this->buffer_pool_mutex);
while (!this->buffer_pool_top) {
@@ -76,6 +94,8 @@ static buf_element_t *buffer_pool_alloc (fifo_buffer_t *this) {
this->buffer_pool_top = this->buffer_pool_top->next;
this->buffer_pool_num_free--;
+ pthread_cleanup_pop (0);
+
pthread_mutex_unlock (&this->buffer_pool_mutex);
return buf;