adaptivedemux: tests: made fakeHTTPsrc element MT safe

https://bugzilla.gnome.org/show_bug.cgi?id=757776
This commit is contained in:
Florin Apostol 2015-11-09 14:13:04 +00:00 committed by Vincent Penquerc'h
parent b328fbe31a
commit 7f3d47deb3

View File

@ -37,6 +37,10 @@
#define GST_IS_FAKE_SOUP_HTTP_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FAKE_SOUP_HTTP_SRC)) #define GST_IS_FAKE_SOUP_HTTP_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FAKE_SOUP_HTTP_SRC))
#define GST_FAKE_SOUP_HTTP_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_FAKE_SOUP_HTTP_SRC, GstFakeSoupHTTPSrcClass)) #define GST_FAKE_SOUP_HTTP_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_FAKE_SOUP_HTTP_SRC, GstFakeSoupHTTPSrcClass))
#define GST_FAKE_SOUP_HTTP_SRC_GET_LOCK(d) (&(((GstFakeSoupHTTPSrc*)(d))->lock))
#define GST_FAKE_SOUP_HTTP_SRC_LOCK(d) g_mutex_lock (GST_FAKE_SOUP_HTTP_SRC_GET_LOCK (d))
#define GST_FAKE_SOUP_HTTP_SRC_UNLOCK(d) g_mutex_unlock (GST_FAKE_SOUP_HTTP_SRC_GET_LOCK (d))
typedef struct _GstFakeSoupHTTPSrc typedef struct _GstFakeSoupHTTPSrc
{ {
GstBaseSrc parent; GstBaseSrc parent;
@ -58,6 +62,9 @@ typedef struct _GstFakeSoupHTTPSrc
/* download error code to simulate during create function */ /* download error code to simulate during create function */
guint downloadErrorCode; guint downloadErrorCode;
/* mutex to protect multithread access to this structure */
GMutex lock;
} GstFakeSoupHTTPSrc; } GstFakeSoupHTTPSrc;
typedef struct _GstFakeSoupHTTPSrcClass typedef struct _GstFakeSoupHTTPSrcClass
@ -144,6 +151,7 @@ gst_fake_soup_http_src_init (GstFakeSoupHTTPSrc * src)
src->downloadErrorCode = 0; src->downloadErrorCode = 0;
gst_base_src_set_blocksize (GST_BASE_SRC (src), gst_base_src_set_blocksize (GST_BASE_SRC (src),
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE); GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
g_mutex_init (&src->lock);
} }
static void static void
@ -153,6 +161,7 @@ gst_fake_soup_http_src_finalize (GObject * object)
src = GST_FAKE_SOUP_HTTP_SRC (object); src = GST_FAKE_SOUP_HTTP_SRC (object);
g_mutex_clear (&src->lock);
g_free (src->uri); g_free (src->uri);
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
@ -166,9 +175,12 @@ gst_fake_soup_http_src_start (GstBaseSrc * basesrc)
src = GST_FAKE_SOUP_HTTP_SRC (basesrc); src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
if (!src->uri) { if (!src->uri) {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (("No URL set.")), GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (("No URL set.")),
("Missing location property")); ("Missing location property"));
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
@ -183,6 +195,7 @@ gst_fake_soup_http_src_start (GstBaseSrc * basesrc)
src->segment_end = src->size; src->segment_end = src->size;
src->downloadErrorCode = 0; src->downloadErrorCode = 0;
gst_base_src_set_dynamic_size (basesrc, FALSE); gst_base_src_set_dynamic_size (basesrc, FALSE);
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE; return TRUE;
} }
} }
@ -190,6 +203,7 @@ gst_fake_soup_http_src_start (GstBaseSrc * basesrc)
GST_WARNING GST_WARNING
("gst_fake_soup_http_src_start cannot find url '%s' in input data", ("gst_fake_soup_http_src_start cannot find url '%s' in input data",
src->uri); src->uri);
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
@ -199,9 +213,13 @@ gst_fake_soup_http_src_stop (GstBaseSrc * basesrc)
GstFakeSoupHTTPSrc *src; GstFakeSoupHTTPSrc *src;
src = GST_FAKE_SOUP_HTTP_SRC (basesrc); src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
src->payload = NULL; src->payload = NULL;
src->position = 0; src->position = 0;
src->size = 0; src->size = 0;
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE; return TRUE;
} }
@ -209,11 +227,18 @@ static gboolean
gst_fake_soup_http_src_is_seekable (GstBaseSrc * basesrc) gst_fake_soup_http_src_is_seekable (GstBaseSrc * basesrc)
{ {
GstFakeSoupHTTPSrc *src; GstFakeSoupHTTPSrc *src;
gboolean ret;
src = GST_FAKE_SOUP_HTTP_SRC (basesrc); src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
/* if size is set, we can seek */ /* if size is set, we can seek */
return src->size > 0; ret = src->size > 0;
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return ret;
} }
static gboolean static gboolean
@ -225,6 +250,8 @@ gst_fake_soup_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
segment->start); segment->start);
src = GST_FAKE_SOUP_HTTP_SRC (basesrc); src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
/* /*
According to RFC7233, the range is inclusive: According to RFC7233, the range is inclusive:
The first-byte-pos value in a byte-range-spec gives the byte-offset The first-byte-pos value in a byte-range-spec gives the byte-offset
@ -234,14 +261,17 @@ gst_fake_soup_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
*/ */
if (!src->uri) { if (!src->uri) {
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
if (segment->start >= src->size) { if (segment->start >= src->size) {
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
if (segment->stop != -1 && segment->stop > src->size) { if (segment->stop != -1 && segment->stop > src->size) {
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
@ -251,6 +281,7 @@ gst_fake_soup_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
src->segment_end = segment->stop; src->segment_end = segment->stop;
} }
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE; return TRUE;
} }
@ -262,13 +293,17 @@ gst_fake_soup_http_src_get_size (GstBaseSrc * basesrc, guint64 * size)
src = GST_FAKE_SOUP_HTTP_SRC (basesrc); src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
if (!src->uri) { if (!src->uri) {
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
/* if it was started (payload or size configured), size is set */ /* if it was started (payload or size configured), size is set */
if (src->payload || src->size > 0) { if (src->payload || src->size > 0) {
*size = src->size; *size = src->size;
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE; return TRUE;
} }
@ -279,9 +314,11 @@ gst_fake_soup_http_src_get_size (GstBaseSrc * basesrc, guint64 * size)
*size = strlen (input[i].payload); *size = strlen (input[i].payload);
else else
*size = input[i].size; *size = input[i].size;
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return TRUE; return TRUE;
} }
} }
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return FALSE; return FALSE;
} }
@ -295,10 +332,13 @@ gst_fake_soup_http_src_create (GstBaseSrc * basesrc, guint64 offset,
src = GST_FAKE_SOUP_HTTP_SRC (basesrc); src = GST_FAKE_SOUP_HTTP_SRC (basesrc);
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
GST_DEBUG ("gst_fake_soup_http_src_create feeding from %" G_GUINT64_FORMAT, GST_DEBUG ("gst_fake_soup_http_src_create feeding from %" G_GUINT64_FORMAT,
src->position); src->position);
if (src->uri == NULL) { if (src->uri == NULL) {
GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
if (src->downloadErrorCode) { if (src->downloadErrorCode) {
@ -306,12 +346,14 @@ gst_fake_soup_http_src_create (GstBaseSrc * basesrc, guint64 offset,
"Generated requested error"), ("%s (%d), URL: %s, Redirect to: %s", "Generated requested error"), ("%s (%d), URL: %s, Redirect to: %s",
"Generated requested error", src->downloadErrorCode, src->uri, "Generated requested error", src->downloadErrorCode, src->uri,
GST_STR_NULL (NULL))); GST_STR_NULL (NULL)));
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
bytes_read = MIN ((src->segment_end - src->position), bytes_read = MIN ((src->segment_end - src->position),
GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE); GST_FAKE_SOUP_HTTP_SRC_MAX_BUF_SIZE);
if (bytes_read == 0) { if (bytes_read == 0) {
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_EOS; return GST_FLOW_EOS;
} }
@ -343,9 +385,11 @@ gst_fake_soup_http_src_create (GstBaseSrc * basesrc, guint64 offset,
src->position += bytes_read; src->position += bytes_read;
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return GST_FLOW_OK; return GST_FLOW_OK;
} }
/* must be called with the lock taken */
static gboolean static gboolean
gst_fake_soup_http_src_set_location (GstFakeSoupHTTPSrc * src, gst_fake_soup_http_src_set_location (GstFakeSoupHTTPSrc * src,
const gchar * uri, GError ** error) const gchar * uri, GError ** error)
@ -373,7 +417,12 @@ static gchar *
gst_fake_soup_http_src_uri_get_uri (GstURIHandler * handler) gst_fake_soup_http_src_uri_get_uri (GstURIHandler * handler)
{ {
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler); GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler);
return g_strdup (src->uri); gchar *uri;
GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
uri = g_strdup (src->uri);
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return uri;
} }
static gboolean static gboolean
@ -381,8 +430,15 @@ gst_fake_soup_http_src_uri_set_uri (GstURIHandler * handler, const gchar * uri,
GError ** err) GError ** err)
{ {
GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler); GstFakeSoupHTTPSrc *src = GST_FAKE_SOUP_HTTP_SRC (handler);
gboolean ret;
return gst_fake_soup_http_src_set_location (src, uri, err); GST_FAKE_SOUP_HTTP_SRC_LOCK (src);
ret = gst_fake_soup_http_src_set_location (src, uri, err);
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (src);
return ret;
} }
static void static void
@ -449,5 +505,7 @@ void
gst_fake_soup_http_src_simulate_download_error (GstFakeSoupHTTPSrc * gst_fake_soup_http_src_simulate_download_error (GstFakeSoupHTTPSrc *
fakeSoupHTTPSrc, guint downloadErrorCode) fakeSoupHTTPSrc, guint downloadErrorCode)
{ {
GST_FAKE_SOUP_HTTP_SRC_LOCK (fakeSoupHTTPSrc);
fakeSoupHTTPSrc->downloadErrorCode = downloadErrorCode; fakeSoupHTTPSrc->downloadErrorCode = downloadErrorCode;
GST_FAKE_SOUP_HTTP_SRC_UNLOCK (fakeSoupHTTPSrc);
} }