From 019ac05ace07ce3e911b90acaee64758028e7375 Mon Sep 17 00:00:00 2001 From: Fabrice Bellard Date: Thu, 17 Jul 2003 10:25:36 +0000 Subject: added primitive aborting system Originally committed as revision 2058 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/avio.c | 22 ++++++++++++++++++++++ libavformat/avio.h | 11 ++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) (limited to 'libavformat') diff --git a/libavformat/avio.c b/libavformat/avio.c index 3cd9e4d991..2c25c8a059 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -19,7 +19,10 @@ #include "avformat.h" #include +static int default_interrupt_cb(void); + URLProtocol *first_protocol = NULL; +URLInterruptCB *url_interrupt_cb = default_interrupt_cb; int register_protocol(URLProtocol *protocol) { @@ -165,3 +168,22 @@ void url_get_filename(URLContext *h, char *buf, int buf_size) { pstrcpy(buf, buf_size, h->filename); } + + +static int default_interrupt_cb(void) +{ + return 0; +} + +/** + * The callback is called in blocking functions to test regulary if + * asynchronous interruption is needed. -EINTR is returned in this + * case by the interrupted function. 'NULL' means no interrupt + * callback is given. + */ +void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) +{ + if (!interrupt_cb) + interrupt_cb = default_interrupt_cb; + url_interrupt_cb = interrupt_cb; +} diff --git a/libavformat/avio.h b/libavformat/avio.h index 29e9489d60..b31689ab25 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -28,6 +28,8 @@ typedef struct URLPollEntry { #define URL_WRONLY 1 #define URL_RDWR 2 +typedef int URLInterruptCB(void); + int url_open(URLContext **h, const char *filename, int flags); int url_read(URLContext *h, unsigned char *buf, int size); int url_write(URLContext *h, unsigned char *buf, int size); @@ -38,6 +40,12 @@ offset_t url_filesize(URLContext *h); int url_get_max_packet_size(URLContext *h); void url_get_filename(URLContext *h, char *buf, int buf_size); +/* the callback is called in blocking functions to test regulary if + asynchronous interruption is needed. -EINTR is returned in this + case by the interrupted function. 'NULL' means no interrupt + callback is given. */ +void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); + /* not implemented */ int url_poll(URLPollEntry *poll_table, int n, int timeout); @@ -52,6 +60,7 @@ typedef struct URLProtocol { } URLProtocol; extern URLProtocol *first_protocol; +extern URLInterruptCB *url_interrupt_cb; int register_protocol(URLProtocol *protocol); @@ -100,7 +109,7 @@ int url_feof(ByteIOContext *s); #define URL_EOF (-1) int url_fgetc(ByteIOContext *s); -int url_fprintf(ByteIOContext *s, const char *fmt, ...); +int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); char *url_fgets(ByteIOContext *s, char *buf, int buf_size); void put_flush_packet(ByteIOContext *s); -- cgit v1.2.1