On Mon, Apr 04, 2011 at 07:02:32PM +0200, Luca Barbato wrote:
> Polling is common to the network protocols: udp, tcp and, once merged,
> sctp.
> ---
>  libavformat/network.h |   13 +++++++++++
>  libavformat/tcp.c     |   14 +----------
>  libavformat/udp.c     |   58 +++++++++++++++++-------------------------------
>  3 files changed, 36 insertions(+), 49 deletions(-)
> 
> diff --git a/libavformat/network.h b/libavformat/network.h
> index 27bebb3..6943bc6 100644
> --- a/libavformat/network.h
> +++ b/libavformat/network.h
> @@ -55,6 +55,10 @@ static inline int ff_neterrno() {
>  #include <arpa/inet.h>
>  #endif
>  
> +#if HAVE_POLL_H
> +#include <poll.h>
> +#endif
> +
>  int ff_socket_nonblock(int socket, int enable);
>  
>  static inline int ff_network_init(void)
> @@ -67,6 +71,15 @@ static inline int ff_network_init(void)
>      return 1;
>  }
>  
> +static inline int ff_network_wait_fd(int fd, int write)
> +{
> +    int ev = write ? POLLOUT : POLLIN;
> +    struct pollfd p = { .fd = fd, .events = ev, .revents = 0 };
> +    int ret;
> +    ret = poll(&p, 1, 100);

Merge those two lines maybe.

> +    return ret < 0 ? ff_neterrno() : p.revents & ev ? 0 : AVERROR(EAGAIN);
> +}
> +
>  static inline void ff_network_close(void)
>  {
>  #if HAVE_WINSOCK2_H
> diff --git a/libavformat/tcp.c b/libavformat/tcp.c
> index 3510d4a..6b9a6ae 100644
> --- a/libavformat/tcp.c
> +++ b/libavformat/tcp.c
> @@ -152,23 +152,13 @@ static int tcp_open(URLContext *h, const char *uri, int 
> flags)
>      return ret;
>  }
>  
> -static int tcp_wait_fd(int fd, int write)
> -{
> -    int ev = write ? POLLOUT : POLLIN;
> -    struct pollfd p = { .fd = fd, .events = ev, .revents = 0 };
> -    int ret;
> -
> -    ret = poll(&p, 1, 100);
> -    return ret < 0 ? ff_neterrno() : p.revents & ev ? 0 : AVERROR(EAGAIN);
> -}
> -
>  static int tcp_read(URLContext *h, uint8_t *buf, int size)
>  {
>      TCPContext *s = h->priv_data;
>      int ret;
>  
>      if (!(h->flags & URL_FLAG_NONBLOCK)) {
> -        ret = tcp_wait_fd(s->fd, 0);
> +        ret = ff_network_wait_fd(s->fd, 0);
>          if (ret < 0)
>              return ret;
>      }
> @@ -182,7 +172,7 @@ static int tcp_write(URLContext *h, const uint8_t *buf, 
> int size)
>      int ret;
>  
>      if (!(h->flags & URL_FLAG_NONBLOCK)) {
> -        ret = tcp_wait_fd(s->fd, 1);
> +        ret = ff_network_wait_fd(s->fd, 1);
>          if (ret < 0)
>              return ret;
>      }
> diff --git a/libavformat/udp.c b/libavformat/udp.c
> index 8d50218..4e32a1e 100644
> --- a/libavformat/udp.c
> +++ b/libavformat/udp.c
> @@ -444,57 +444,41 @@ static int udp_open(URLContext *h, const char *uri, int 
> flags)
>      return AVERROR(EIO);
>  }
>  
> +

Unrelated.

>  static int udp_read(URLContext *h, uint8_t *buf, int size)
>  {
>      UDPContext *s = h->priv_data;
> -    struct pollfd p = {s->udp_fd, POLLIN, 0};
> -    int len;
>      int ret;
>  
> -    for(;;) {
> -        if (url_interrupt_cb())
> -            return AVERROR_EXIT;
> -        ret = poll(&p, 1, 100);
> -        if (ret < 0) {
> -            if (ff_neterrno() == AVERROR(EINTR))
> -                continue;
> -            return AVERROR(EIO);
> -        }
> -        if (!(ret == 1 && p.revents & POLLIN))
> -            continue;
> -        len = recv(s->udp_fd, buf, size, 0);
> -        if (len < 0) {
> -            if (ff_neterrno() != AVERROR(EAGAIN) &&
> -                ff_neterrno() != AVERROR(EINTR))
> -                return AVERROR(EIO);
> -        } else {
> -            break;
> -        }
> +    if (!(h->flags & URL_FLAG_NONBLOCK)) {
> +        ret = ff_network_wait_fd(s->udp_fd, 0);
> +        if (ret < 0)
> +            return ret;
>      }
> -    return len;
> +    ret = recv(s->udp_fd, buf, size, 0);
> +    return ret < 0 ? ff_neterrno() : ret;

As discussed on IRC, this changes behavior, so should be in a separate
patch. Or at least it deserves a comment in the commit message.

>  }
>  
> +

Also unrelated.

-- 
Anton Khirnov

Attachment: signature.asc
Description: Digital signature

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to