]> git.sesse.net Git - vlc/commitdiff
V4L2: fix poll() error handling
authorRémi Denis-Courmont <remi@remlab.net>
Sun, 23 Jan 2011 15:44:51 +0000 (17:44 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sun, 23 Jan 2011 15:48:09 +0000 (17:48 +0200)
Do not read revents in case of error.
Do not busy loop if POLLERR or POLLHUP get set.

modules/access/v4l2.c

index 9dcab74ed46869c2d4c2df480145704d67b87dad..5a5c888ee8d3b01e804727d93731cef2bfcd74d1 100644 (file)
@@ -1259,13 +1259,8 @@ static block_t *AccessRead( access_t * p_access )
     fd.revents = 0;
 
     /* Wait for data */
-    if( poll( &fd, 1, 500 ) ) /* Timeout after 0.5 seconds since I don't know if pf_demux can be blocking. */
-    {
-        if( fd.revents & (POLLIN|POLLPRI) )
-        {
-            return GrabVideo( VLC_OBJECT(p_access), p_sys );
-        }
-    }
+    if( poll( &fd, 1, 500 ) > 0 ) /* Timeout after 0.5 seconds since I don't know if pf_demux can be blocking. */
+        return GrabVideo( VLC_OBJECT(p_access), p_sys );
 
     return NULL;
 }
@@ -1323,16 +1318,21 @@ static int Demux( demux_t *p_demux )
     fd.revents = 0;
 
     /* Wait for data */
-    if( poll( &fd, 1, 500 ) ) /* Timeout after 0.5 seconds since I don't know if pf_demux can be blocking. */
-    {
-        if( fd.revents & (POLLIN|POLLPRI) )
+    /* Timeout after 0.5 seconds since I don't know if pf_demux can be blocking. */
+    while( poll( &fd, 1, 500 ) == -1 )
+        if( errno != EINTR )
         {
-            block_t *p_block = GrabVideo( VLC_OBJECT(p_demux), p_sys );
-            if( p_block )
-            {
-                es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );
-                es_out_Send( p_demux->out, p_sys->p_es, p_block );
-            }
+            msg_Err( p_demux, "poll error: %m" );
+            return -1;
+        }
+
+    if( fd.revents )
+    {
+         block_t *p_block = GrabVideo( VLC_OBJECT(p_demux), p_sys );
+         if( p_block )
+         {
+             es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );
+             es_out_Send( p_demux->out, p_sys->p_es, p_block );
         }
     }