1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

Introduce ff_network_wait_fd_timeout()

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Andrey Utkin 2012-10-09 15:26:02 +03:00 committed by Michael Niedermayer
parent 3a45688abc
commit d2b18c8f5b
2 changed files with 35 additions and 0 deletions

View File

@ -22,6 +22,8 @@
#include "network.h"
#include "libavcodec/internal.h"
#include "libavutil/mem.h"
#include "url.h"
#include "libavutil/time.h"
#define THREADS (HAVE_PTHREADS || (defined(WIN32) && !defined(__MINGW32CE__)))
@ -150,6 +152,26 @@ 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)
{
int ret;
int64_t wait_start = 0;
while (1) {
ret = ff_network_wait_fd(fd, write);
if (ret != AVERROR(EAGAIN))
return ret;
if (ff_check_interrupt(int_cb))
return AVERROR_EXIT;
if (timeout) {
if (!wait_start)
wait_start = av_gettime();
else if (av_gettime() - wait_start > timeout)
return AVERROR(ETIMEDOUT);
}
}
}
void ff_network_close(void)
{
#if HAVE_WINSOCK2_H

View File

@ -26,6 +26,7 @@
#include "config.h"
#include "libavutil/error.h"
#include "os_support.h"
#include "avio.h"
#if HAVE_UNISTD_H
#include <unistd.h>
@ -80,6 +81,18 @@ void ff_tls_deinit(void);
int ff_network_wait_fd(int fd, int write);
/**
* This works similarly to ff_network_wait_fd, but waits up to 'timeout' microseconds
* Uses ff_network_wait_fd in a loop
*
* @fd Socket descriptor
* @write Set 1 to wait for socket able to be read, 0 to be written
* @timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage
* @param int_cb Interrupt callback, is checked after each ff_network_wait_fd call
* @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_inet_aton (const char * str, struct in_addr * add);
#if !HAVE_STRUCT_SOCKADDR_STORAGE