Commit bd3a0ce3 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

access_file: use the waitpipe and always poll

This removes dummy wakeups, and fixes a deadlock when quitting while
reading from a FIFO.
parent 3fe7ae53
...@@ -96,7 +96,6 @@ vlc_module_begin(); ...@@ -96,7 +96,6 @@ vlc_module_begin();
set_capability( "access", 50 ); set_capability( "access", 50 );
add_shortcut( "file" ); add_shortcut( "file" );
add_shortcut( "stream" ); add_shortcut( "stream" );
add_shortcut( "kfir" );
set_callbacks( Open, Close ); set_callbacks( Open, Close );
vlc_module_end(); vlc_module_end();
...@@ -113,7 +112,6 @@ static int open_file( access_t *, const char * ); ...@@ -113,7 +112,6 @@ static int open_file( access_t *, const char * );
struct access_sys_t struct access_sys_t
{ {
unsigned int i_nb_reads; unsigned int i_nb_reads;
bool b_kfir;
int fd; int fd;
...@@ -137,7 +135,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -137,7 +135,6 @@ static int Open( vlc_object_t *p_this )
STANDARD_READ_ACCESS_INIT; STANDARD_READ_ACCESS_INIT;
p_sys->i_nb_reads = 0; p_sys->i_nb_reads = 0;
p_sys->b_kfir = false;
int fd = p_sys->fd = -1; int fd = p_sys->fd = -1;
if (!strcasecmp (p_access->psz_access, "stream")) if (!strcasecmp (p_access->psz_access, "stream"))
...@@ -145,12 +142,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -145,12 +142,6 @@ static int Open( vlc_object_t *p_this )
p_sys->b_seekable = false; p_sys->b_seekable = false;
p_sys->b_pace_control = 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 else
{ {
p_sys->b_seekable = true; 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 ) ...@@ -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; int fd = p_sys->fd;
#if !defined(WIN32) && !defined(UNDER_CE) #if !defined(WIN32) && !defined(UNDER_CE)
if( !p_sys->b_pace_control ) if( !p_sys->b_seekable )
{ {
if( !p_sys->b_kfir ) /* Note that POSIX regular files (b_seekable) opened for read are
{ * guaranteed to always set POLLIN immediately, so we can spare
/* Find if some data is available. This won't work under Windows. */ * poll()ing them. */
do /* Wait until some data is available. Impossible on Windows. */
{ struct pollfd ufd[2] = {
struct pollfd ufd; { .fd = fd, .events = POLLIN, },
{ .fd = vlc_object_waitpipe (p_access), .events = POLLIN, },
if( p_access->b_die ) };
return 0;
if (poll (ufd, 2, -1) < 0 || ufd[1].revents)
memset (&ufd, 0, sizeof (ufd)); return -1;
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 );
}
}
} }
else
#endif /* WIN32 || UNDER_CE */ #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 ) if( i_ret < 0 )
{ {
switch (errno) switch (errno)
...@@ -275,11 +246,11 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) ...@@ -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"), intf_UserFatal (p_access, false, _("File reading failed"),
_("VLC could not read the file.")); _("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++; 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 ) ...@@ -297,12 +268,6 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len )
} }
} }
#endif #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; return i_ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment