[vlc-commits] udp: simplify based on previous commit (refs #13979)
Rémi Denis-Courmont
git at videolan.org
Wed Jul 1 18:22:09 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Jun 30 23:52:51 2015 +0300| [b9d91820ea9e6f237c3364031960bdb6742e1ca1] | committer: Rémi Denis-Courmont
udp: simplify based on previous commit (refs #13979)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b9d91820ea9e6f237c3364031960bdb6742e1ca1
---
modules/access/udp.c | 43 +++++++++++++++++++++++++------------------
1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/modules/access/udp.c b/modules/access/udp.c
index 7472bf8..9e08b55 100644
--- a/modules/access/udp.c
+++ b/modules/access/udp.c
@@ -42,6 +42,8 @@
#include <vlc_access.h>
#include <vlc_network.h>
#include <vlc_block.h>
+#include <vlc_interrupt.h>
+#include <fcntl.h>
#define MTU 65535
@@ -72,9 +74,9 @@ vlc_module_end ()
struct access_sys_t
{
int fd;
- bool running;
size_t fifo_size;
block_fifo_t *fifo;
+ vlc_sem_t semaphore;
vlc_thread_t thread;
};
@@ -160,6 +162,15 @@ static int Open( vlc_object_t *p_this )
goto error;
}
+ /* Revert to blocking I/O */
+#ifndef _WIN32
+ fcntl(sys->fd, F_SETFL, fcntl(sys->fd, F_GETFL) & ~O_NONBLOCK);
+#else
+ ioctlsocket(sys->fd, FIONBIO, &(unsigned long){ 0 });
+#endif
+
+ /* FIXME: There are no particular reasons to create a FIFO and thread here.
+ * Those are just working around bugs in the stream cache. */
sys->fifo = block_FifoNew();
if( unlikely( sys->fifo == NULL ) )
{
@@ -167,12 +178,13 @@ static int Open( vlc_object_t *p_this )
goto error;
}
- sys->running = true;
sys->fifo_size = var_InheritInteger( p_access, "udp-buffer");
+ vlc_sem_init( &sys->semaphore, 0 );
if( vlc_clone( &sys->thread, ThreadRead, p_access,
VLC_THREAD_PRIORITY_INPUT ) )
{
+ vlc_sem_destroy( &sys->semaphore );
block_FifoRelease( sys->fifo );
net_Close( sys->fd );
error:
@@ -193,6 +205,7 @@ static void Close( vlc_object_t *p_this )
vlc_cancel( sys->thread );
vlc_join( sys->thread, NULL );
+ vlc_sem_destroy( &sys->semaphore );
block_FifoRelease( sys->fifo );
net_Close( sys->fd );
free( sys );
@@ -239,12 +252,9 @@ static block_t *BlockUDP( access_t *p_access )
if (p_access->info.b_eof)
return NULL;
+ vlc_sem_wait_i11e(&sys->semaphore);
vlc_fifo_Lock(sys->fifo);
- if (vlc_fifo_IsEmpty(sys->fifo) && sys->running)
- vlc_fifo_Wait(sys->fifo);
-
block = vlc_fifo_DequeueUnlocked(sys->fifo);
- p_access->info.b_eof = !sys->running;
vlc_fifo_Unlock(sys->fifo);
return block;
@@ -264,7 +274,7 @@ static void* ThreadRead( void *data )
if (unlikely(pkt == NULL))
{ /* OOM - dequeue and discard one packet */
char dummy;
- net_Read(access, sys->fd, &dummy, 1, false);
+ recv(sys->fd, &dummy, 1, 0);
continue;
}
@@ -272,15 +282,15 @@ static void* ThreadRead( void *data )
block_cleanup_push(pkt);
do
- len = net_Read(access, sys->fd, pkt->p_buffer, MTU, false);
- while (len == -1 && errno != EINTR);
- vlc_cleanup_pop();
-
- if (len == -1)
{
- block_Release(pkt);
- break;
+#ifndef LIBVLC_USE_PTHREAD
+ struct pollfd ufd = { .fd = sys->fd, .events = POLLIN };
+ while (poll(&ufd, 1, -1) <= 0); /* cancellation point */
+#endif
+ len = recv(sys->fd, pkt->p_buffer, MTU, 0);
}
+ while (len == -1);
+ vlc_cleanup_pop();
pkt->i_buffer = len;
@@ -295,11 +305,8 @@ static void* ThreadRead( void *data )
vlc_fifo_QueueUnlocked(sys->fifo, pkt);
vlc_fifo_Unlock(sys->fifo);
+ vlc_sem_post(&sys->semaphore);
}
- vlc_fifo_Lock(sys->fifo);
- sys->running = false;
- vlc_fifo_Signal(sys->fifo);
- vlc_fifo_Unlock(sys->fifo);
return NULL;
}
More information about the vlc-commits
mailing list