added primitive aborting system
authorFabrice Bellard <fabrice@bellard.org>
Thu, 17 Jul 2003 10:25:36 +0000 (10:25 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Thu, 17 Jul 2003 10:25:36 +0000 (10:25 +0000)
Originally committed as revision 2058 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avio.c
libavformat/avio.h

index 3cd9e4d..2c25c8a 100644 (file)
 #include "avformat.h"
 #include <ctype.h>
 
+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;
+}
index 29e9489..b31689a 100644 (file)
@@ -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);