diff options
author | Thiago Santos <thiagoss@osg.samsung.com> | 2016-01-22 15:58:19 -0300 |
---|---|---|
committer | Thiago Santos <thiagossantos@gmail.com> | 2016-12-07 11:08:10 -0300 |
commit | 5e50dd5a4eec1113618902aae5b2ef91f32dd257 (patch) | |
tree | 98b68b9a6eafba118c953dca2d05ccd6a817ad63 | |
parent | ae662117ced5ca638774bcbc104471ca06c74ca9 (diff) |
httpcookiejar: add locking
Add a recmutex to only allow the cookie jar to be modified from
a single thread, prevent concurrent edits and unexpected results
when notifying listeners of the changed signal.
-rw-r--r-- | gst-libs/gst/http/gsthttpcookiejar.c | 21 | ||||
-rw-r--r-- | gst-libs/gst/http/gsthttpcookiejar.h | 1 |
2 files changed, 20 insertions, 2 deletions
diff --git a/gst-libs/gst/http/gsthttpcookiejar.c b/gst-libs/gst/http/gsthttpcookiejar.c index a20d02885..2044c3fae 100644 --- a/gst-libs/gst/http/gsthttpcookiejar.c +++ b/gst-libs/gst/http/gsthttpcookiejar.c @@ -61,9 +61,15 @@ typedef struct gboolean constructed; GHashTable *domains, *serials; guint serial; + + GRecMutex mutex; } GstHttpCookieJarPrivate; #define GST_HTTP_COOKIE_JAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_HTTP_COOKIE_JAR, GstHttpCookieJarPrivate)) +#define GST_HTTP_COOKIE_JAR_GET_MUTEX(j) &(GST_HTTP_COOKIE_JAR_GET_PRIVATE (GST_HTTP_COOKIE_JAR_CAST (j))->mutex) +#define GST_HTTP_COOKIE_JAR_LOCK(j) g_rec_mutex_lock (GST_HTTP_COOKIE_JAR_GET_MUTEX(j)) +#define GST_HTTP_COOKIE_JAR_UNLOCK(j) g_rec_mutex_unlock (GST_HTTP_COOKIE_JAR_GET_MUTEX(j)) + /** * gst_http_str_case_hash: * @key: ASCII string to hash @@ -103,7 +109,6 @@ gst_http_str_case_equal (gconstpointer v1, gconstpointer v2) return g_ascii_strcasecmp (string1, string2) == 0; } - static void gst_http_cookie_jar_init (GstHttpCookieJar * jar) { @@ -251,6 +256,8 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author, g_return_if_fail (GST_HTTP_IS_COOKIE_JAR (jar)); g_return_if_fail (cookie != NULL); + GST_HTTP_COOKIE_JAR_LOCK (jar); + #if 0 /* Never accept cookies for public domains. */ if (!g_hostname_is_ip_address (cookie->domain) && @@ -286,6 +293,7 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author, gst_http_cookie_free (old_cookie); } + GST_HTTP_COOKIE_JAR_UNLOCK (jar); return; } last = oc; @@ -294,6 +302,7 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author, /* The new cookie is... a new cookie */ if (cookie->expires && date_time_is_past (cookie->expires)) { gst_http_cookie_free (cookie); + GST_HTTP_COOKIE_JAR_UNLOCK (jar); return; } @@ -305,6 +314,7 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author, } gst_http_cookie_jar_changed (jar, author, NULL, cookie); + GST_HTTP_COOKIE_JAR_UNLOCK (jar); } /** @@ -335,6 +345,7 @@ gst_http_cookie_jar_all_cookies (GstHttpCookieJar * jar) priv = GST_HTTP_COOKIE_JAR_GET_PRIVATE (jar); g_array_set_clear_func (result, (GDestroyNotify) gst_http_cookie_clear); + GST_HTTP_COOKIE_JAR_LOCK (jar); g_hash_table_iter_init (&iter, priv->domains); @@ -349,6 +360,7 @@ gst_http_cookie_jar_all_cookies (GstHttpCookieJar * jar) } } + GST_HTTP_COOKIE_JAR_UNLOCK (jar); return result; } @@ -374,9 +386,12 @@ gst_http_cookie_jar_delete_cookie (GstHttpCookieJar * jar, GObject * author, priv = GST_HTTP_COOKIE_JAR_GET_PRIVATE (jar); + GST_HTTP_COOKIE_JAR_LOCK (jar); cookies = g_hash_table_lookup (priv->domains, cookie->domain); - if (cookies == NULL) + if (cookies == NULL) { + GST_HTTP_COOKIE_JAR_UNLOCK (jar); return; + } for (p = cookies; p; p = p->next) { GstHttpCookie *c = (GstHttpCookie *) p->data; @@ -385,7 +400,9 @@ gst_http_cookie_jar_delete_cookie (GstHttpCookieJar * jar, GObject * author, g_hash_table_insert (priv->domains, g_strdup (cookie->domain), cookies); gst_http_cookie_jar_changed (jar, author, c, NULL); gst_http_cookie_free (c); + GST_HTTP_COOKIE_JAR_UNLOCK (jar); return; } } + GST_HTTP_COOKIE_JAR_UNLOCK (jar); } diff --git a/gst-libs/gst/http/gsthttpcookiejar.h b/gst-libs/gst/http/gsthttpcookiejar.h index 9d613def0..85c42ef37 100644 --- a/gst-libs/gst/http/gsthttpcookiejar.h +++ b/gst-libs/gst/http/gsthttpcookiejar.h @@ -41,6 +41,7 @@ G_BEGIN_DECLS #define GST_HTTP_IS_COOKIE_JAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_HTTP_COOKIE_JAR)) #define GST_HTTP_IS_COOKIE_JAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), GST_TYPE_HTTP_COOKIE_JAR)) #define GST_HTTP_COOKIE_JAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_HTTP_COOKIE_JAR, GstHttpCookieJarClass)) +#define GST_HTTP_COOKIE_JAR_CAST(obj) ((GstHttpCookieJar *) (obj)) typedef struct _GstHttpCookieJar { GstObject parent; |