[FFmpeg-devel] [PATCH 2/2] avformat/udp: Replace use of pthread_cancel.

Matt Oliver protogonoi at gmail.com
Fri Dec 2 10:22:01 EET 2016


---
 configure         |  6 ------
 libavformat/udp.c | 48 +++++++++++++++++++-----------------------------
 2 files changed, 19 insertions(+), 35 deletions(-)

diff --git a/configure b/configure
index b5bfad6..cec94c4 100755
--- a/configure
+++ b/configure
@@ -1934,7 +1934,6 @@ SYSTEM_FUNCS="
     nanosleep
     PeekNamedPipe
     posix_memalign
-    pthread_cancel
     sched_getaffinity
     SetConsoleTextAttribute
     SetConsoleCtrlHandler
@@ -5623,11 +5622,6 @@ if ! disabled pthreads && ! enabled w32threads && !
enabled os2threads; then
     check_code cc "pthread.h" "static pthread_mutex_t atomic_lock =
PTHREAD_MUTEX_INITIALIZER" || disable pthreads
 fi

-
-if enabled pthreads; then
-  check_func pthread_cancel
-fi
-
 enabled pthreads &&
     check_builtin sem_timedwait semaphore.h "sem_t *s; sem_init(s,0,0);
sem_timedwait(s,0); sem_destroy(s)"

diff --git a/libavformat/udp.c b/libavformat/udp.c
index 3835f98..857a979 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -60,12 +60,8 @@
 #define IPPROTO_UDPLITE                                  136
 #endif

-#if HAVE_PTHREAD_CANCEL
-#include <pthread.h>
-#endif
-
-#ifndef HAVE_PTHREAD_CANCEL
-#define HAVE_PTHREAD_CANCEL 0
+#if HAVE_THREADS
+#include "libavutil/thread.h"
 #endif

 #ifndef IPV6_ADD_MEMBERSHIP
@@ -100,7 +96,7 @@ typedef struct UDPContext {
     int64_t bitrate; /* number of bits to send per second */
     int64_t burst_bits;
     int close_req;
-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
     pthread_t circular_buffer_thread;
     pthread_mutex_t mutex;
     pthread_cond_t cond;
@@ -495,14 +491,13 @@ static int udp_get_file_handle(URLContext *h)
     return s->udp_fd;
 }

-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
 static void *circular_buffer_task_rx( void *_URLContext)
 {
     URLContext *h = _URLContext;
     UDPContext *s = h->priv_data;
     int old_cancelstate;

-    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
     pthread_mutex_lock(&s->mutex);
     if (ff_socket_nonblock(s->udp_fd, 0) < 0) {
         av_log(h, AV_LOG_ERROR, "Failed to set blocking mode");
@@ -511,14 +506,11 @@ static void *circular_buffer_task_rx( void
*_URLContext)
     }
     while(1) {
         int len;
+        if (s->close_req)
+            goto end;

         pthread_mutex_unlock(&s->mutex);
-        /* Blocking operations are always cancellation points;
-           see "General Information" / "Thread Cancelation Overview"
-           in Single Unix. */
-        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);
         len = recv(s->udp_fd, s->tmp+4, sizeof(s->tmp)-4, 0);
-        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
         pthread_mutex_lock(&s->mutex);
         if (len < 0) {
             if (ff_neterrno() != AVERROR(EAGAIN) && ff_neterrno() !=
AVERROR(EINTR)) {
@@ -564,7 +556,6 @@ static void *circular_buffer_task_tx( void *_URLContext)
     int64_t burst_interval = s->bitrate ? (s->burst_bits * 1000000 /
s->bitrate) : 0;
     int64_t max_delay = s->bitrate ?  ((int64_t)h->max_packet_size * 8 *
1000000 / s->bitrate + 1) : 0;

-    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
     pthread_mutex_lock(&s->mutex);

     if (ff_socket_nonblock(s->udp_fd, 0) < 0) {
@@ -599,7 +590,6 @@ static void *circular_buffer_task_tx( void *_URLContext)
         av_fifo_generic_read(s->fifo, s->tmp, len, NULL);

         pthread_mutex_unlock(&s->mutex);
-        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);

         if (s->bitrate) {
             timestamp = av_gettime_relative();
@@ -645,7 +635,6 @@ static void *circular_buffer_task_tx( void *_URLContext)
             }
         }

-        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
         pthread_mutex_lock(&s->mutex);
     }

@@ -730,7 +719,7 @@ static int udp_open(URLContext *h, const char *uri, int
flags)
             /* assume if no digits were found it is a request to enable it
*/
             if (buf == endptr)
                 s->overrun_nonfatal = 1;
-            if (!HAVE_PTHREAD_CANCEL)
+            if (!HAVE_THREADS)
                 av_log(h, AV_LOG_WARNING,
                        "'overrun_nonfatal' option was set but it is not
supported "
                        "on this build (pthread support is required)\n");
@@ -758,14 +747,14 @@ static int udp_open(URLContext *h, const char *uri,
int flags)
         }
         if (av_find_info_tag(buf, sizeof(buf), "fifo_size", p)) {
             s->circular_buffer_size = strtol(buf, NULL, 10);
-            if (!HAVE_PTHREAD_CANCEL)
+            if (!HAVE_THREADS)
                 av_log(h, AV_LOG_WARNING,
                        "'circular_buffer_size' option was set but it is
not supported "
                        "on this build (pthread support is required)\n");
         }
         if (av_find_info_tag(buf, sizeof(buf), "bitrate", p)) {
             s->bitrate = strtoll(buf, NULL, 10);
-            if (!HAVE_PTHREAD_CANCEL)
+            if (!HAVE_THREADS)
                 av_log(h, AV_LOG_WARNING,
                        "'bitrate' option was set but it is not supported "
                        "on this build (pthread support is required)\n");
@@ -951,7 +940,7 @@ static int udp_open(URLContext *h, const char *uri, int
flags)

     s->udp_fd = udp_fd;

-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
     /*
       Create thread in case of:
       1. Input and circular_buffer_size is set
@@ -988,7 +977,7 @@ static int udp_open(URLContext *h, const char *uri, int
flags)
 #endif

     return 0;
-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
  thread_fail:
     pthread_cond_destroy(&s->cond);
  cond_fail:
@@ -1019,7 +1008,7 @@ static int udp_read(URLContext *h, uint8_t *buf, int
size)
 {
     UDPContext *s = h->priv_data;
     int ret;
-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
     int avail, nonblock = h->flags & AVIO_FLAG_NONBLOCK;

     if (s->fifo) {
@@ -1051,12 +1040,13 @@ static int udp_read(URLContext *h, uint8_t *buf,
int size)
             else {
                 /* FIXME: using the monotonic clock would be better,
                    but it does not exist on all supported platforms. */
+                int ret;
                 int64_t t = av_gettime() + 100000;
                 struct timespec tv = { .tv_sec  =  t / 1000000,
                                        .tv_nsec = (t % 1000000) * 1000 };
-                if (pthread_cond_timedwait(&s->cond, &s->mutex, &tv) < 0) {
+                if (ret = pthread_cond_timedwait(&s->cond, &s->mutex, &tv)
< 0) {
                     pthread_mutex_unlock(&s->mutex);
-                    return AVERROR(errno == ETIMEDOUT ? EAGAIN : errno);
+                    return AVERROR(ret == ETIMEDOUT ? EAGAIN : ret);
                 }
                 nonblock = 1;
             }
@@ -1079,7 +1069,7 @@ static int udp_write(URLContext *h, const uint8_t
*buf, int size)
     UDPContext *s = h->priv_data;
     int ret;

-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
     if (s->fifo) {
         uint8_t tmp[4];

@@ -1128,7 +1118,7 @@ static int udp_close(URLContext *h)
 {
     UDPContext *s = h->priv_data;

-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
     // Request close once writing is finished
     if (s->thread_started && !(h->flags & AVIO_FLAG_READ)) {
         pthread_mutex_lock(&s->mutex);
@@ -1140,12 +1130,12 @@ static int udp_close(URLContext *h)

     if (s->is_multicast && (h->flags & AVIO_FLAG_READ))
         udp_leave_multicast_group(s->udp_fd, (struct sockaddr
*)&s->dest_addr,(struct sockaddr *)&s->local_addr_storage);
-#if HAVE_PTHREAD_CANCEL
+#if HAVE_THREADS
     if (s->thread_started) {
         int ret;
         // Cancel only read, as write has been signaled as success to the
user
         if (h->flags & AVIO_FLAG_READ)
-            pthread_cancel(s->circular_buffer_thread);
+            s->close_req = 1;
         ret = pthread_join(s->circular_buffer_thread, NULL);
         if (ret != 0)
             av_log(h, AV_LOG_ERROR, "pthread_join(): %s\n", strerror(ret));
-- 
2.10.2.windows.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-avformat-udp-Replace-use-of-pthread_cancel.patch
Type: application/octet-stream
Size: 8295 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161202/9b338245/attachment.obj>


More information about the ffmpeg-devel mailing list