vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Wed Feb 18 19:05:01 2015 +0200| [bab9bfbf9053e1ce1c5d53ea62fb92b143f6739a] | committer: Rémi Denis-Courmont
access: add vlc_access_poll() This is an attempt to complement (and possibly eventually replace) the net_Read() & net_Write() family of functions. In some cases, it is desirable to handel I/O events on more than one file descriptors. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bab9bfbf9053e1ce1c5d53ea62fb92b143f6739a --- include/vlc_access.h | 4 ++++ src/input/access.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/libvlccore.sym | 1 + 3 files changed, 56 insertions(+) diff --git a/include/vlc_access.h b/include/vlc_access.h index e83d53f..ddb5948 100644 --- a/include/vlc_access.h +++ b/include/vlc_access.h @@ -151,6 +151,10 @@ static inline void access_InitFields( access_t *p_a ) */ VLC_API input_thread_t * access_GetParentInput( access_t *p_access ) VLC_USED; +struct pollfd; + +VLC_API int vlc_access_poll(access_t *, struct pollfd *, unsigned long, int); + #define ACCESS_SET_CALLBACKS( read, block, control, seek ) \ do { \ p_access->pf_read = (read); \ diff --git a/src/input/access.c b/src/input/access.c index a9b2804..184074c 100644 --- a/src/input/access.c +++ b/src/input/access.c @@ -25,6 +25,13 @@ # include "config.h" #endif +#include <assert.h> +#include <stdlib.h> +#include <errno.h> +#ifdef HAVE_POLL +# include <poll.h> +#endif + #include "access.h" #include <libvlc.h> #include <vlc_url.h> @@ -124,3 +131,47 @@ input_thread_t * access_GetParentInput( access_t *p_access ) return p_access->p_input ? vlc_object_hold((vlc_object_t *)p_access->p_input) : NULL; } +/** + * Polls for I/O events or an asynchronous signal. This functions behaves like + * the standard poll() function with two exceptions: + * - If the provided access object belongs to an input thread, and the input + * thread received a control request since the previous call to + * this function, it will return -1 and set errno to EINTR. + * - The function may spuriously return -1 and set errno to EINTR. + * + * @param access access object + * @param fds table specifying the file descriptors and events + * @param nfds number of elements in the table + * @param timeout timeout (in milliseconds) or -1 + * + * @return Normally, the number of file descriptors with at least one pending + * event is returned. In particular, if the timeout is reached without any + * events, then zero is returned. On error, -1 is returned. + * + */ +int vlc_access_poll(access_t *access, struct pollfd fds[], unsigned long nfds, + int timeout_ms) +{ + assert(access != NULL); + + input_thread_t *input = access->p_input; + int ret; + + do + { + /* FIXME: do not shorten the timeout */ + int to = ((unsigned)timeout_ms > 500u) ? 500 : timeout_ms; + + ret = poll(fds, nfds, to); + + /* FIXME: handle other events than killing the input */ + if (ret == 0 && input != NULL && !vlc_object_alive((vlc_object_t *)input)) + { + errno = EINTR; + ret = -1; + } + } + while (ret == 0); + + return ret; +} diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 7f06ed6..579433b 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -482,6 +482,7 @@ video_format_Setup video_format_Print video_splitter_Delete video_splitter_New +vlc_access_poll vlc_b64_decode vlc_b64_decode_binary vlc_b64_decode_binary_to_buffer _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
