[vlc-devel] [PATCH 7/8] mmal: Use atomic operations for refcounting
Julian Scheel
julian at jusst.de
Wed Jun 3 09:37:34 CEST 2015
Signed-off-by: Julian Scheel <julian at jusst.de>
---
modules/hw/mmal/codec.c | 8 ++++----
modules/hw/mmal/deinterlace.c | 9 +++++----
modules/hw/mmal/vout.c | 8 +++-----
3 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/modules/hw/mmal/codec.c b/modules/hw/mmal/codec.c
index 183981c..36af836 100644
--- a/modules/hw/mmal/codec.c
+++ b/modules/hw/mmal/codec.c
@@ -438,7 +438,7 @@ static int send_output_buffer(decoder_t *dec)
ret = -1;
goto err;
}
- sys->output_in_transit++;
+ atomic_fetch_add(&sys->output_in_transit, 1);
return ret;
@@ -456,7 +456,7 @@ static void fill_output_port(decoder_t *dec)
unsigned max_buffers_in_transit = __MAX(sys->output_pool->headers_num,
MIN_NUM_BUFFERS_IN_TRANSIT);
unsigned buffers_available = mmal_queue_length(sys->output_pool->queue);
- unsigned buffers_to_send = max_buffers_in_transit - sys->output_in_transit;
+ unsigned buffers_to_send = max_buffers_in_transit - atomic_load(&sys->output_in_transit);
unsigned i;
if (buffers_to_send > buffers_available)
@@ -464,7 +464,7 @@ static void fill_output_port(decoder_t *dec)
#ifndef NDEBUG
msg_Dbg(dec, "Send %d buffers to output port (available: %d, in_transit: %d, buffer_num: %d)",
- buffers_to_send, buffers_available, sys->output_in_transit,
+ buffers_to_send, buffers_available, atomic_load(&sys->output_in_transit),
sys->output->buffer_num);
#endif
for (i = 0; i < buffers_to_send; ++i)
@@ -656,7 +656,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
buffer->data = NULL;
mmal_buffer_header_release(buffer);
}
- sys->output_in_transit--;
+ atomic_fetch_sub(&sys->output_in_transit, 1);
} else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) {
fmt = mmal_event_format_changed_get(buffer);
diff --git a/modules/hw/mmal/deinterlace.c b/modules/hw/mmal/deinterlace.c
index d8e3172..2ba63cd 100644
--- a/modules/hw/mmal/deinterlace.c
+++ b/modules/hw/mmal/deinterlace.c
@@ -30,6 +30,7 @@
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_filter.h>
+#include <vlc_atomic.h>
#include "mmal_picture.h"
@@ -382,7 +383,7 @@ static int send_output_buffer(filter_t *filter)
picture_Release(picture);
ret = -1;
} else {
- sys->output_in_transit++;
+ atomic_fetch_add(&sys->output_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
}
vlc_mutex_unlock(&sys->buffer_cond_mutex);
@@ -471,7 +472,7 @@ static picture_t *deinterlace(filter_t *filter, picture_t *picture)
msg_Err(filter, "Failed to send buffer to input port (status=%"PRIx32" %s)",
status, mmal_status_to_string(status));
} else {
- sys->input_in_transit++;
+ atomic_fetch_add(&sys->input_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
}
vlc_mutex_unlock(&sys->buffer_cond_mutex);
@@ -527,7 +528,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
if (picture)
picture_Release(picture);
- sys->input_in_transit--;
+ atomic_fetch_sub(&sys->input_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_cond_mutex);
}
@@ -548,7 +549,7 @@ static void output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
buffer->user_data = NULL;
}
- sys->output_in_transit--;
+ atomic_fetch_sub(&sys->output_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_cond_mutex);
} else if (buffer->cmd == MMAL_EVENT_FORMAT_CHANGED) {
diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
index 569b8a3..6654db2 100644
--- a/modules/hw/mmal/vout.c
+++ b/modules/hw/mmal/vout.c
@@ -564,12 +564,10 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
buffer->cmd = 0;
buffer->length = sys->input->buffer_size;
- vlc_mutex_lock(&sys->buffer_mutex);
status = mmal_port_send_buffer(sys->input, buffer);
if (status == MMAL_SUCCESS)
- ++sys->buffers_in_transit;
+ atomic_fetch_add(&sys->buffers_in_transit, 1);
- vlc_mutex_unlock(&sys->buffer_mutex);
if (status != MMAL_SUCCESS) {
msg_Err(vd, "Failed to send buffer to input port. Frame dropped");
picture_Release(picture);
@@ -590,7 +588,7 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
sys->next_phase_check = (sys->next_phase_check + 1) % PHASE_CHECK_INTERVAL;
vlc_mutex_lock(&sys->buffer_mutex);
- while (sys->buffers_in_transit >= MAX_BUFFERS_IN_TRANSIT)
+ while (atomic_load(&sys->buffers_in_transit) >= MAX_BUFFERS_IN_TRANSIT)
vlc_cond_wait(&sys->buffer_cond, &sys->buffer_mutex);
vlc_mutex_unlock(&sys->buffer_mutex);
}
@@ -688,7 +686,7 @@ static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
picture_Release(picture);
vlc_mutex_lock(&sys->buffer_mutex);
- --sys->buffers_in_transit;
+ atomic_fetch_sub(&sys->buffers_in_transit, 1);
vlc_cond_signal(&sys->buffer_cond);
vlc_mutex_unlock(&sys->buffer_mutex);
}
--
2.4.0
More information about the vlc-devel
mailing list