diff mbox series

[FFmpeg-devel,v2,1/2] lavf/network: add wait fd callback to ff_network_wait_fd_timeout

Message ID tencent_5719DC600BACA60ED0A166E667DEEA8B5306@qq.com
State New
Headers show
Series [FFmpeg-devel,v2,1/2] lavf/network: add wait fd callback to ff_network_wait_fd_timeout
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Zhao Zhili Feb. 8, 2021, 3:04 a.m. UTC
---
 libavformat/libamqp.c |  4 ++--
 libavformat/network.c | 16 ++++++++++++++--
 libavformat/network.h | 14 +++++++++++++-
 libavformat/tcp.c     |  6 ++++--
 4 files changed, 33 insertions(+), 7 deletions(-)

Comments

Zhao Zhili March 1, 2021, 6:53 a.m. UTC | #1
Ping.

> On Feb 8, 2021, at 11:04 AM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> ---
> libavformat/libamqp.c |  4 ++--
> libavformat/network.c | 16 ++++++++++++++--
> libavformat/network.h | 14 +++++++++++++-
> libavformat/tcp.c     |  6 ++++--
> 4 files changed, 33 insertions(+), 7 deletions(-)
> 
> diff --git a/libavformat/libamqp.c b/libavformat/libamqp.c
> index c3b9c484ea..ca7d3ab70f 100644
> --- a/libavformat/libamqp.c
> +++ b/libavformat/libamqp.c
> @@ -241,7 +241,7 @@ static int amqp_proto_write(URLContext *h, const unsigned char *buf, int size)
>     amqp_bytes_t message = { size, (void *)buf };
>     amqp_basic_properties_t props;
> 
> -    ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback);
> +    ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback, NULL);
>     if (ret)
>         return ret;
> 
> @@ -270,7 +270,7 @@ static int amqp_proto_read(URLContext *h, unsigned char *buf, int size)
>     amqp_rpc_reply_t broker_reply;
>     amqp_envelope_t envelope;
> 
> -    ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback);
> +    ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback, NULL);
>     if (ret)
>         return ret;
> 
> diff --git a/libavformat/network.c b/libavformat/network.c
> index 0f5a575f77..48a9af012e 100644
> --- a/libavformat/network.c
> +++ b/libavformat/network.c
> @@ -75,15 +75,27 @@ int ff_network_wait_fd(int fd, int write)
>     return ret < 0 ? ff_neterrno() : p.revents & (ev | POLLERR | POLLHUP) ? 0 : AVERROR(EAGAIN);
> }
> 
> -int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb)
> +static int network_wait_fd_callback(int fd, int write, void *opaque) {
> +    return ff_network_wait_fd(fd, write);
> +}
> +
> +int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout,
> +        AVIOInterruptCB *int_cb, const NetworkWaitFdCB *wait_cb)
> {
>     int ret;
>     int64_t wait_start = 0;
> 
> +    const static NetworkWaitFdCB wait_cb_internal = {
> +        .wait_fd = network_wait_fd_callback,
> +    };
> +
> +    if (!wait_cb)
> +        wait_cb = &wait_cb_internal;
> +
>     while (1) {
>         if (ff_check_interrupt(int_cb))
>             return AVERROR_EXIT;
> -        ret = ff_network_wait_fd(fd, write);
> +        ret = ff_network_wait_fd_cb(wait_cb, fd, write);
>         if (ret != AVERROR(EAGAIN))
>             return ret;
>         if (timeout > 0) {
> diff --git a/libavformat/network.h b/libavformat/network.h
> index 71347e815b..1a02a6d9ee 100644
> --- a/libavformat/network.h
> +++ b/libavformat/network.h
> @@ -84,6 +84,16 @@ void ff_network_close(void);
> int ff_tls_init(void);
> void ff_tls_deinit(void);
> 
> +typedef struct NetworkWaitFdCB {
> +    int (*wait_fd)(int /*fd*/, int /*write*/, void* /*opaque*/);
> +    void *opaque;
> +} NetworkWaitFdCB;
> +
> +static av_always_inline int ff_network_wait_fd_cb(const NetworkWaitFdCB *cb,
> +        int fd, int write) {
> +    return cb->wait_fd(fd, write, cb->opaque);
> +}
> +
> int ff_network_wait_fd(int fd, int write);
> 
> /**
> @@ -94,9 +104,11 @@ int ff_network_wait_fd(int fd, int write);
>  * @param write Set 1 to wait for socket able to be read, 0 to be written
>  * @param timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage
>  * @param int_cb Interrupt callback, is checked before each ff_network_wait_fd call
> + * @param wait_cb Wait callback, default implementation is used if NULL
>  * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code
>  */
> -int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb);
> +int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout,
> +        AVIOInterruptCB *int_cb, const NetworkWaitFdCB *wait_cb);
> 
> /**
>  * Waits for up to 'timeout' microseconds. If the usert's int_cb is set and
> diff --git a/libavformat/tcp.c b/libavformat/tcp.c
> index 2198e0f00e..437eaecbb4 100644
> --- a/libavformat/tcp.c
> +++ b/libavformat/tcp.c
> @@ -237,7 +237,8 @@ static int tcp_read(URLContext *h, uint8_t *buf, int size)
>     int ret;
> 
>     if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
> -        ret = ff_network_wait_fd_timeout(s->fd, 0, h->rw_timeout, &h->interrupt_callback);
> +        ret = ff_network_wait_fd_timeout(s->fd, 0, h->rw_timeout,
> +                &h->interrupt_callback, NULL);
>         if (ret)
>             return ret;
>     }
> @@ -253,7 +254,8 @@ static int tcp_write(URLContext *h, const uint8_t *buf, int size)
>     int ret;
> 
>     if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
> -        ret = ff_network_wait_fd_timeout(s->fd, 1, h->rw_timeout, &h->interrupt_callback);
> +        ret = ff_network_wait_fd_timeout(s->fd, 1, h->rw_timeout,
> +                &h->interrupt_callback, NULL);
>         if (ret)
>             return ret;
>     }
> -- 
> 2.28.0
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavformat/libamqp.c b/libavformat/libamqp.c
index c3b9c484ea..ca7d3ab70f 100644
--- a/libavformat/libamqp.c
+++ b/libavformat/libamqp.c
@@ -241,7 +241,7 @@  static int amqp_proto_write(URLContext *h, const unsigned char *buf, int size)
     amqp_bytes_t message = { size, (void *)buf };
     amqp_basic_properties_t props;
 
-    ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback);
+    ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback, NULL);
     if (ret)
         return ret;
 
@@ -270,7 +270,7 @@  static int amqp_proto_read(URLContext *h, unsigned char *buf, int size)
     amqp_rpc_reply_t broker_reply;
     amqp_envelope_t envelope;
 
-    ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback);
+    ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback, NULL);
     if (ret)
         return ret;
 
diff --git a/libavformat/network.c b/libavformat/network.c
index 0f5a575f77..48a9af012e 100644
--- a/libavformat/network.c
+++ b/libavformat/network.c
@@ -75,15 +75,27 @@  int ff_network_wait_fd(int fd, int write)
     return ret < 0 ? ff_neterrno() : p.revents & (ev | POLLERR | POLLHUP) ? 0 : AVERROR(EAGAIN);
 }
 
-int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb)
+static int network_wait_fd_callback(int fd, int write, void *opaque) {
+    return ff_network_wait_fd(fd, write);
+}
+
+int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout,
+        AVIOInterruptCB *int_cb, const NetworkWaitFdCB *wait_cb)
 {
     int ret;
     int64_t wait_start = 0;
 
+    const static NetworkWaitFdCB wait_cb_internal = {
+        .wait_fd = network_wait_fd_callback,
+    };
+
+    if (!wait_cb)
+        wait_cb = &wait_cb_internal;
+
     while (1) {
         if (ff_check_interrupt(int_cb))
             return AVERROR_EXIT;
-        ret = ff_network_wait_fd(fd, write);
+        ret = ff_network_wait_fd_cb(wait_cb, fd, write);
         if (ret != AVERROR(EAGAIN))
             return ret;
         if (timeout > 0) {
diff --git a/libavformat/network.h b/libavformat/network.h
index 71347e815b..1a02a6d9ee 100644
--- a/libavformat/network.h
+++ b/libavformat/network.h
@@ -84,6 +84,16 @@  void ff_network_close(void);
 int ff_tls_init(void);
 void ff_tls_deinit(void);
 
+typedef struct NetworkWaitFdCB {
+    int (*wait_fd)(int /*fd*/, int /*write*/, void* /*opaque*/);
+    void *opaque;
+} NetworkWaitFdCB;
+
+static av_always_inline int ff_network_wait_fd_cb(const NetworkWaitFdCB *cb,
+        int fd, int write) {
+    return cb->wait_fd(fd, write, cb->opaque);
+}
+
 int ff_network_wait_fd(int fd, int write);
 
 /**
@@ -94,9 +104,11 @@  int ff_network_wait_fd(int fd, int write);
  * @param write Set 1 to wait for socket able to be read, 0 to be written
  * @param timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage
  * @param int_cb Interrupt callback, is checked before each ff_network_wait_fd call
+ * @param wait_cb Wait callback, default implementation is used if NULL
  * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code
  */
-int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb);
+int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout,
+        AVIOInterruptCB *int_cb, const NetworkWaitFdCB *wait_cb);
 
 /**
  * Waits for up to 'timeout' microseconds. If the usert's int_cb is set and
diff --git a/libavformat/tcp.c b/libavformat/tcp.c
index 2198e0f00e..437eaecbb4 100644
--- a/libavformat/tcp.c
+++ b/libavformat/tcp.c
@@ -237,7 +237,8 @@  static int tcp_read(URLContext *h, uint8_t *buf, int size)
     int ret;
 
     if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
-        ret = ff_network_wait_fd_timeout(s->fd, 0, h->rw_timeout, &h->interrupt_callback);
+        ret = ff_network_wait_fd_timeout(s->fd, 0, h->rw_timeout,
+                &h->interrupt_callback, NULL);
         if (ret)
             return ret;
     }
@@ -253,7 +254,8 @@  static int tcp_write(URLContext *h, const uint8_t *buf, int size)
     int ret;
 
     if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
-        ret = ff_network_wait_fd_timeout(s->fd, 1, h->rw_timeout, &h->interrupt_callback);
+        ret = ff_network_wait_fd_timeout(s->fd, 1, h->rw_timeout,
+                &h->interrupt_callback, NULL);
         if (ret)
             return ret;
     }