[vlc-devel] commit: access_file: use the waitpipe and always poll ( Rémi Denis-Courmont )
git version control
git at videolan.org
Fri Jun 20 23:25:45 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sat Jun 21 00:27:44 2008 +0300| [bd3a0ce3785a21e7ffa02a47a67ae342502c2d33]
access_file: use the waitpipe and always poll
This removes dummy wakeups, and fixes a deadlock when quitting while
reading from a FIFO.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bd3a0ce3785a21e7ffa02a47a67ae342502c2d33
---
modules/access/file.c | 69 ++++++++++++-------------------------------------
1 files changed, 17 insertions(+), 52 deletions(-)
diff --git a/modules/access/file.c b/modules/access/file.c
index 1878f40..cdf51ac 100644
--- a/modules/access/file.c
+++ b/modules/access/file.c
@@ -96,7 +96,6 @@ vlc_module_begin();
set_capability( "access", 50 );
add_shortcut( "file" );
add_shortcut( "stream" );
- add_shortcut( "kfir" );
set_callbacks( Open, Close );
vlc_module_end();
@@ -113,7 +112,6 @@ static int open_file( access_t *, const char * );
struct access_sys_t
{
unsigned int i_nb_reads;
- bool b_kfir;
int fd;
@@ -137,7 +135,6 @@ static int Open( vlc_object_t *p_this )
STANDARD_READ_ACCESS_INIT;
p_sys->i_nb_reads = 0;
- p_sys->b_kfir = false;
int fd = p_sys->fd = -1;
if (!strcasecmp (p_access->psz_access, "stream"))
@@ -145,12 +142,6 @@ static int Open( vlc_object_t *p_this )
p_sys->b_seekable = false;
p_sys->b_pace_control = false;
}
- else if (!strcasecmp (p_access->psz_access, "kfir"))
- {
- p_sys->b_seekable = false;
- p_sys->b_pace_control = false;
- p_sys->b_kfir = true;
- }
else
{
p_sys->b_seekable = true;
@@ -225,43 +216,23 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
int fd = p_sys->fd;
#if !defined(WIN32) && !defined(UNDER_CE)
- if( !p_sys->b_pace_control )
+ if( !p_sys->b_seekable )
{
- if( !p_sys->b_kfir )
- {
- /* Find if some data is available. This won't work under Windows. */
- do
- {
- struct pollfd ufd;
-
- if( p_access->b_die )
- return 0;
-
- memset (&ufd, 0, sizeof (ufd));
- ufd.fd = fd;
- ufd.events = POLLIN;
-
- i_ret = poll (&ufd, 1, 500);
- }
- while (i_ret <= 0);
-
- i_ret = read (fd, p_buffer, i_len);
- }
- else
- {
- /* b_kfir ; work around a buggy poll() driver implementation */
- while (((i_ret = read (fd, p_buffer, i_len)) == 0)
- && !p_access->b_die)
- {
- msleep( INPUT_ERROR_SLEEP );
- }
- }
+ /* Note that POSIX regular files (b_seekable) opened for read are
+ * guaranteed to always set POLLIN immediately, so we can spare
+ * poll()ing them. */
+ /* Wait until some data is available. Impossible on Windows. */
+ struct pollfd ufd[2] = {
+ { .fd = fd, .events = POLLIN, },
+ { .fd = vlc_object_waitpipe (p_access), .events = POLLIN, },
+ };
+
+ if (poll (ufd, 2, -1) < 0 || ufd[1].revents)
+ return -1;
}
- else
#endif /* WIN32 || UNDER_CE */
- /* b_pace_control || WIN32 */
- i_ret = read( fd, p_buffer, i_len );
+ i_ret = read (fd, p_buffer, i_len);
if( i_ret < 0 )
{
switch (errno)
@@ -275,11 +246,11 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
intf_UserFatal (p_access, false, _("File reading failed"),
_("VLC could not read the file."));
}
-
- /* Delay a bit to avoid consuming all the CPU. This is particularly
- * useful when reading from an unconnected FIFO. */
- msleep( INPUT_ERROR_SLEEP );
}
+ else if( i_ret > 0 )
+ p_access->info.i_pos += i_ret;
+ else if( i_ret == 0 )
+ p_access->info.b_eof = true;
p_sys->i_nb_reads++;
@@ -297,12 +268,6 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
}
}
#endif
-
- if( i_ret > 0 )
- p_access->info.i_pos += i_ret;
- else if( i_ret == 0 )
- p_access->info.b_eof = true;
-
return i_ret;
}
More information about the vlc-devel
mailing list