[vlc-devel] commit: block: cancellation safety ( Rémi Denis-Courmont )
git version control
git at videolan.org
Wed Aug 27 22:57:33 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sun Aug 10 21:44:52 2008 +0300| [af2e2a70c042bb3529fa5f419b222d81acf13289] | committer: Rémi Denis-Courmont
block: cancellation safety
(Eventually, this could replace block_FifoWake))
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=af2e2a70c042bb3529fa5f419b222d81acf13289
---
include/vlc_block.h | 8 ++++++++
src/misc/block.c | 21 ++++++++++++---------
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/include/vlc_block.h b/include/vlc_block.h
index 0c4623c..9696305 100644
--- a/include/vlc_block.h
+++ b/include/vlc_block.h
@@ -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 ) );
diff --git a/src/misc/block.c b/src/misc/block.c
index d5ce01b..97281cb 100644
--- a/src/misc/block.c
+++ b/src/misc/block.c
@@ -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;
More information about the vlc-devel
mailing list