]> git.sesse.net Git - vlc/commitdiff
block: cancellation safety
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 10 Aug 2008 18:44:52 +0000 (21:44 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Wed, 27 Aug 2008 19:43:10 +0000 (22:43 +0300)
(Eventually, this could replace block_FifoWake))

include/vlc_block.h
src/misc/block.c

index 0c4623c30231fe13e0601b48882ce3daff22cefb..96963055e0cb110b33781f3a61e21445bb84802d 100644 (file)
@@ -155,6 +155,12 @@ static inline void block_Release( block_t *p_block )
 VLC_EXPORT( block_t *, block_mmap_Alloc, (void *addr, size_t length) );
 VLC_EXPORT( block_t *, block_File, (int fd) );
 
+static inline void block_Cleanup (void *block)
+{
+    block_Release ((block_t *)block);
+}
+#define block_cleanup_push( block ) vlc_cleanup_push (block_Cleanup, block)
+
 /****************************************************************************
  * Chains of blocks functions helper
  ****************************************************************************
@@ -282,6 +288,8 @@ static inline block_t *block_ChainGather( block_t *p_list )
  * - block_FifoSize : how many cumulated bytes are waiting in the fifo
  * - block_FifoWake : wake ups a thread with block_FifoGet() = NULL
  *   (this is used to wakeup a thread when there is no data to queue)
+ *
+ * block_FifoGet and block_FifoShow are cancellation points.
  ****************************************************************************/
 
 VLC_EXPORT( block_fifo_t *, block_FifoNew,      ( void ) );
index d5ce01b05bc1bf5a4d26ec966a89bd94f42fba76..97281cb5f12020d99da92e08a96749ae04cc4f50 100644 (file)
@@ -270,7 +270,7 @@ ssize_t pread (int fd, void *buf, size_t count, off_t offset)
  * Loads a file into a block of memory. If possible a private file mapping is
  * created. Otherwise, the file is read normally. On 32-bits platforms, this
  * function will not work for very large files, due to memory space
- * constraints.
+ * constraints. Cancellation point.
  *
  * @param fd file descriptor to load from
  * @return a new block with the file content at p_buffer, and file length at
@@ -325,6 +325,7 @@ block_t *block_File (int fd)
     block_t *block = block_Alloc (length);
     if (block == NULL)
         return NULL;
+    block_cleanup_push (block);
 
     for (size_t i = 0; i < length;)
     {
@@ -332,10 +333,12 @@ block_t *block_File (int fd)
         if (len == -1)
         {
             block_Release (block);
-            return NULL;
+            block = NULL;
+            break;
         }
         i += len;
     }
+    vlc_cleanup_pop ();
     return block;
 }
 
@@ -437,14 +440,14 @@ block_t *block_FifoGet( block_fifo_t *p_fifo )
     block_t *b;
 
     vlc_mutex_lock( &p_fifo->lock );
+    mutex_cleanup_push( &p_fifo->lock );
 
     /* Remember vlc_cond_wait() may cause spurious wakeups
      * (on both Win32 and POSIX) */
     while( ( p_fifo->p_first == NULL ) && !p_fifo->b_force_wake )
-    {
         vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
-    }
 
+    vlc_cleanup_pop();
     b = p_fifo->p_first;
 
     p_fifo->b_force_wake = false;
@@ -475,24 +478,24 @@ block_t *block_FifoShow( block_fifo_t *p_fifo )
     block_t *b;
 
     vlc_mutex_lock( &p_fifo->lock );
+    mutex_cleanup_push( &p_fifo->lock );
 
     if( p_fifo->p_first == NULL )
-    {
         vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
-    }
 
     b = p_fifo->p_first;
 
-    vlc_mutex_unlock( &p_fifo->lock );
-
-    return( b );
+    vlc_cleanup_run ();
+    return b;
 }
 
+/* FIXME: not thread-safe */
 size_t block_FifoSize( const block_fifo_t *p_fifo )
 {
     return p_fifo->i_size;
 }
 
+/* FIXME: not thread-safe */
 size_t block_FifoCount( const block_fifo_t *p_fifo )
 {
     return p_fifo->i_depth;