X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fblock.c;h=97281cb5f12020d99da92e08a96749ae04cc4f50;hb=af2e2a70c042bb3529fa5f419b222d81acf13289;hp=d5ce01b05bc1bf5a4d26ec966a89bd94f42fba76;hpb=7783a1cec9d1ac33b81c181da859dc1d6fc7cf9a;p=vlc diff --git a/src/misc/block.c b/src/misc/block.c index d5ce01b05b..97281cb5f1 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;