shm: don't use deprecated threading API

This commit is contained in:
Tim-Philipp Müller 2013-02-09 19:49:08 +00:00
parent 6c4029357c
commit 68a34d2a60
2 changed files with 18 additions and 15 deletions

View file

@ -37,7 +37,6 @@
#include "gstshmsink.h" #include "gstshmsink.h"
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/glib-compat-private.h>
#include <string.h> #include <string.h>
@ -104,7 +103,7 @@ static guint signals[LAST_SIGNAL] = { 0 };
static void static void
gst_shm_sink_init (GstShmSink * self) gst_shm_sink_init (GstShmSink * self)
{ {
self->cond = g_cond_new (); g_cond_init (&self->cond);
self->size = DEFAULT_SIZE; self->size = DEFAULT_SIZE;
self->wait_for_connection = DEFAULT_WAIT_FOR_CONNECTION; self->wait_for_connection = DEFAULT_WAIT_FOR_CONNECTION;
self->perms = DEFAULT_PERMS; self->perms = DEFAULT_PERMS;
@ -190,7 +189,7 @@ gst_shm_sink_finalize (GObject * object)
{ {
GstShmSink *self = GST_SHM_SINK (object); GstShmSink *self = GST_SHM_SINK (object);
g_cond_free (self->cond); g_cond_clear (&self->cond);
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
} }
@ -239,13 +238,13 @@ gst_shm_sink_set_property (GObject * object, guint prop_id,
GST_OBJECT_LOCK (object); GST_OBJECT_LOCK (object);
self->wait_for_connection = g_value_get_boolean (value); self->wait_for_connection = g_value_get_boolean (value);
GST_OBJECT_UNLOCK (object); GST_OBJECT_UNLOCK (object);
g_cond_broadcast (self->cond); g_cond_broadcast (&self->cond);
break; break;
case PROP_BUFFER_TIME: case PROP_BUFFER_TIME:
GST_OBJECT_LOCK (object); GST_OBJECT_LOCK (object);
self->buffer_time = g_value_get_int64 (value); self->buffer_time = g_value_get_int64 (value);
GST_OBJECT_UNLOCK (object); GST_OBJECT_UNLOCK (object);
g_cond_broadcast (self->cond); g_cond_broadcast (&self->cond);
break; break;
default: default:
break; break;
@ -290,6 +289,7 @@ static gboolean
gst_shm_sink_start (GstBaseSink * bsink) gst_shm_sink_start (GstBaseSink * bsink)
{ {
GstShmSink *self = GST_SHM_SINK (bsink); GstShmSink *self = GST_SHM_SINK (bsink);
GError *err = NULL;
self->stop = FALSE; self->stop = FALSE;
@ -322,7 +322,8 @@ gst_shm_sink_start (GstBaseSink * bsink)
gst_poll_add_fd (self->poll, &self->serverpollfd); gst_poll_add_fd (self->poll, &self->serverpollfd);
gst_poll_fd_ctl_read (self->poll, &self->serverpollfd, TRUE); gst_poll_fd_ctl_read (self->poll, &self->serverpollfd, TRUE);
self->pollthread = g_thread_create (pollthread_func, self, TRUE, NULL); self->pollthread =
g_thread_try_new ("gst-shmsink-poll-thread", pollthread_func, self, &err);
if (!self->pollthread) if (!self->pollthread)
goto thread_error; goto thread_error;
@ -335,7 +336,9 @@ thread_error:
self->pipe = NULL; self->pipe = NULL;
gst_poll_free (self->poll); gst_poll_free (self->poll);
GST_ELEMENT_ERROR (self, CORE, THREAD, ("Could not srart thread"), (NULL)); GST_ELEMENT_ERROR (self, CORE, THREAD, ("Could not start thread"),
("%s", err->message));
g_error_free (err);
return FALSE; return FALSE;
} }
@ -398,7 +401,7 @@ gst_shm_sink_render (GstBaseSink * bsink, GstBuffer * buf)
GST_OBJECT_LOCK (self); GST_OBJECT_LOCK (self);
while (self->wait_for_connection && !self->clients) { while (self->wait_for_connection && !self->clients) {
g_cond_wait (self->cond, GST_OBJECT_GET_LOCK (self)); g_cond_wait (&self->cond, GST_OBJECT_GET_LOCK (self));
if (self->unlock) { if (self->unlock) {
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
return GST_FLOW_FLUSHING; return GST_FLOW_FLUSHING;
@ -406,7 +409,7 @@ gst_shm_sink_render (GstBaseSink * bsink, GstBuffer * buf)
} }
while (!gst_shm_sink_can_render (self, GST_BUFFER_TIMESTAMP (buf))) { while (!gst_shm_sink_can_render (self, GST_BUFFER_TIMESTAMP (buf))) {
g_cond_wait (self->cond, GST_OBJECT_GET_LOCK (self)); g_cond_wait (&self->cond, GST_OBJECT_GET_LOCK (self));
if (self->unlock) { if (self->unlock) {
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
return GST_FLOW_FLUSHING; return GST_FLOW_FLUSHING;
@ -423,14 +426,14 @@ gst_shm_sink_render (GstBaseSink * bsink, GstBuffer * buf)
gchar *shmbuf = NULL; gchar *shmbuf = NULL;
while ((block = sp_writer_alloc_block (self->pipe, while ((block = sp_writer_alloc_block (self->pipe,
gst_buffer_get_size (buf))) == NULL) { gst_buffer_get_size (buf))) == NULL) {
g_cond_wait (self->cond, GST_OBJECT_GET_LOCK (self)); g_cond_wait (&self->cond, GST_OBJECT_GET_LOCK (self));
if (self->unlock) { if (self->unlock) {
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
return GST_FLOW_FLUSHING; return GST_FLOW_FLUSHING;
} }
} }
while (self->wait_for_connection && !self->clients) { while (self->wait_for_connection && !self->clients) {
g_cond_wait (self->cond, GST_OBJECT_GET_LOCK (self)); g_cond_wait (&self->cond, GST_OBJECT_GET_LOCK (self));
if (self->unlock) { if (self->unlock) {
sp_writer_free_block (block); sp_writer_free_block (block);
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
@ -615,7 +618,7 @@ pollthread_func (gpointer data)
goto again; goto again;
} }
g_cond_broadcast (self->cond); g_cond_broadcast (&self->cond);
} }
return NULL; return NULL;
@ -631,7 +634,7 @@ gst_shm_sink_event (GstBaseSink * bsink, GstEvent * event)
GST_OBJECT_LOCK (self); GST_OBJECT_LOCK (self);
while (self->wait_for_connection && sp_writer_pending_writes (self->pipe) while (self->wait_for_connection && sp_writer_pending_writes (self->pipe)
&& !self->unlock) && !self->unlock)
g_cond_wait (self->cond, GST_OBJECT_GET_LOCK (self)); g_cond_wait (&self->cond, GST_OBJECT_GET_LOCK (self));
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
break; break;
default: default:
@ -651,7 +654,7 @@ gst_shm_sink_unlock (GstBaseSink * bsink)
self->unlock = TRUE; self->unlock = TRUE;
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
g_cond_broadcast (self->cond); g_cond_broadcast (&self->cond);
return TRUE; return TRUE;
} }

View file

@ -63,7 +63,7 @@ struct _GstShmSink
gboolean unlock; gboolean unlock;
GstClockTimeDiff buffer_time; GstClockTimeDiff buffer_time;
GCond *cond; GCond cond;
}; };
struct _GstShmSinkClass struct _GstShmSinkClass