brasero r1669 - in trunk: . src/plugins/checksum src/plugins/dvdcss src/plugins/libburnia src/plugins/local-track



Author: philippr
Date: Wed Dec 31 13:39:33 2008
New Revision: 1669
URL: http://svn.gnome.org/viewvc/brasero?rev=1669&view=rev

Log:
2008-12-31  Philippe Rouquier  <ykw localhost localdomain>

	Avoid a possible race condition when stopping threads in plugins

	* src/plugins/checksum/burn-checksum-files.c
	(brasero_checksum_files_thread), (brasero_checksum_files_stop),
	(brasero_checksum_files_init), (brasero_checksum_files_finalize):
	* src/plugins/checksum/burn-checksum-image.c
	(brasero_checksum_image_thread), (brasero_checksum_image_stop),
	(brasero_checksum_image_init), (brasero_checksum_image_finalize):
	* src/plugins/dvdcss/burn-dvdcss.c
	(brasero_dvdcss_write_image_thread), (brasero_dvdcss_stop_real),
	(brasero_dvdcss_init), (brasero_dvdcss_finalize):
	* src/plugins/libburnia/burn-libisofs.c
	(brasero_libisofs_thread_started),
	(brasero_libisofs_create_volume_thread),
	(brasero_libisofs_stop_real), (brasero_libisofs_init),
	(brasero_libisofs_finalize):
	* src/plugins/local-track/burn-local-image.c
	(brasero_local_track_thread), (brasero_local_track_stop),
	(brasero_local_track_finalize), (brasero_local_track_init):
	* src/plugins/local-track/burn-uri.c (brasero_burn_uri_thread),
	(brasero_burn_uri_stop), (brasero_burn_uri_finalize),
	(brasero_burn_uri_init):

Modified:
   trunk/ChangeLog
   trunk/src/plugins/checksum/burn-checksum-files.c
   trunk/src/plugins/checksum/burn-checksum-image.c
   trunk/src/plugins/dvdcss/burn-dvdcss.c
   trunk/src/plugins/libburnia/burn-libisofs.c
   trunk/src/plugins/local-track/burn-local-image.c
   trunk/src/plugins/local-track/burn-uri.c

Modified: trunk/src/plugins/checksum/burn-checksum-files.c
==============================================================================
--- trunk/src/plugins/checksum/burn-checksum-files.c	(original)
+++ trunk/src/plugins/checksum/burn-checksum-files.c	Wed Dec 31 13:39:33 2008
@@ -66,6 +66,8 @@
 
 	/* this is for the thread and the end of it */
 	GThread *thread;
+	GMutex *mutex;
+	GCond *cond;
 	gint end_id;
 
 	guint cancel;
@@ -1111,7 +1113,12 @@
 						brasero_checksum_files_destroy);
 	}
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+
 	g_thread_exit (NULL);
 	return NULL;
 }
@@ -1198,12 +1205,14 @@
 
 	priv = BRASERO_CHECKSUM_FILES_PRIVATE (job);
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread) {
 		priv->cancel = 1;
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
 		priv->cancel = 0;
 		priv->thread = NULL;
 	}
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->end_id) {
 		g_source_remove (priv->end_id);
@@ -1225,7 +1234,13 @@
 
 static void
 brasero_checksum_files_init (BraseroChecksumFiles *obj)
-{ }
+{	BraseroChecksumFilesPrivate *priv;
+
+	priv = BRASERO_CHECKSUM_FILES_PRIVATE (obj);
+
+	priv->mutex = g_mutex_new ();
+	priv->cond = g_cond_new ();
+}
 
 static void
 brasero_checksum_files_finalize (GObject *object)
@@ -1234,12 +1249,14 @@
 	
 	priv = BRASERO_CHECKSUM_FILES_PRIVATE (object);
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread) {
 		priv->cancel = 1;
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
 		priv->cancel = 0;
 		priv->thread = NULL;
 	}
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->end_id) {
 		g_source_remove (priv->end_id);
@@ -1251,6 +1268,16 @@
 		priv->file = NULL;
 	}
 
+	if (priv->mutex) {
+		g_mutex_free (priv->mutex);
+		priv->mutex = NULL;
+	}
+
+	if (priv->cond) {
+		g_cond_free (priv->cond);
+		priv->cond = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 

Modified: trunk/src/plugins/checksum/burn-checksum-image.c
==============================================================================
--- trunk/src/plugins/checksum/burn-checksum-image.c	(original)
+++ trunk/src/plugins/checksum/burn-checksum-image.c	Wed Dec 31 13:39:33 2008
@@ -63,6 +63,8 @@
 
 	/* this is for the thread and the end of it */
 	GThread *thread;
+	GMutex *mutex;
+	GCond *cond;
 	gint end_id;
 
 	guint cancel;
@@ -577,7 +579,12 @@
 						brasero_checksum_image_destroy);
 	}
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+
 	g_thread_exit (NULL);
 	return NULL;
 }
@@ -671,12 +678,14 @@
 
 	priv = BRASERO_CHECKSUM_IMAGE_PRIVATE (job);
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread) {
 		priv->cancel = 1;
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
 		priv->cancel = 0;
 		priv->thread = NULL;
 	}
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->end_id) {
 		g_source_remove (priv->end_id);
@@ -693,7 +702,13 @@
 
 static void
 brasero_checksum_image_init (BraseroChecksumImage *obj)
-{ }
+{	BraseroChecksumImagePrivate *priv;
+
+	priv = BRASERO_CHECKSUM_IMAGE_PRIVATE (obj);
+
+	priv->mutex = g_mutex_new ();
+	priv->cond = g_cond_new ();
+}
 
 static void
 brasero_checksum_image_finalize (GObject *object)
@@ -702,12 +717,14 @@
 	
 	priv = BRASERO_CHECKSUM_IMAGE_PRIVATE (object);
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread) {
 		priv->cancel = 1;
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
 		priv->cancel = 0;
 		priv->thread = NULL;
 	}
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->end_id) {
 		g_source_remove (priv->end_id);
@@ -719,6 +736,16 @@
 		priv->checksum = NULL;
 	}
 
+	if (priv->mutex) {
+		g_mutex_free (priv->mutex);
+		priv->mutex = NULL;
+	}
+
+	if (priv->cond) {
+		g_cond_free (priv->cond);
+		priv->cond = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 

Modified: trunk/src/plugins/dvdcss/burn-dvdcss.c
==============================================================================
--- trunk/src/plugins/dvdcss/burn-dvdcss.c	(original)
+++ trunk/src/plugins/dvdcss/burn-dvdcss.c	Wed Dec 31 13:39:33 2008
@@ -54,6 +54,8 @@
 struct _BraseroDvdcssPrivate {
 	GError *error;
 	GThread *thread;
+	GMutex *mutex;
+	GCond *cond;
 	guint thread_id;
 
 	guint cancel:1;
@@ -504,7 +506,12 @@
 	if (!priv->cancel)
 		priv->thread_id = g_idle_add (brasero_dvdcss_thread_finished, self);
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+
 	g_thread_exit (NULL);
 
 	return NULL;
@@ -560,11 +567,14 @@
 	BraseroDvdcssPrivate *priv;
 
 	priv = BRASERO_DVDCSS_PRIVATE (self);
+
+	g_mutex_lock (priv->mutex);
 	if (priv->thread) {
 		priv->cancel = 1;
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
 		priv->cancel = 0;
 	}
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->thread_id) {
 		g_source_remove (priv->thread_id);
@@ -606,12 +616,34 @@
 
 static void
 brasero_dvdcss_init (BraseroDvdcss *obj)
-{ }
+{
+	BraseroDvdcssPrivate *priv;
+
+	priv = BRASERO_DVDCSS_PRIVATE (obj);
+
+	priv->mutex = g_mutex_new ();
+	priv->cond = g_cond_new ();
+}
 
 static void
 brasero_dvdcss_finalize (GObject *object)
 {
+	BraseroDvdcssPrivate *priv;
+
+	priv = BRASERO_DVDCSS_PRIVATE (object);
+
 	brasero_dvdcss_stop_real (BRASERO_DVDCSS (object));
+
+	if (priv->mutex) {
+		g_mutex_free (priv->mutex);
+		priv->mutex = NULL;
+	}
+
+	if (priv->cond) {
+		g_cond_free (priv->cond);
+		priv->cond = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 

Modified: trunk/src/plugins/libburnia/burn-libisofs.c
==============================================================================
--- trunk/src/plugins/libburnia/burn-libisofs.c	(original)
+++ trunk/src/plugins/libburnia/burn-libisofs.c	Wed Dec 31 13:39:33 2008
@@ -60,6 +60,8 @@
 
 	GError *error;
 	GThread *thread;
+	GMutex *mutex;
+	GCond *cond;
 	guint thread_id;
 
 	guint cancel:1;
@@ -279,7 +281,12 @@
 	if (!priv->cancel)
 		priv->thread_id = g_idle_add (brasero_libisofs_thread_finished, self);
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+
 	g_thread_exit (NULL);
 	return NULL;
 }
@@ -804,7 +811,12 @@
 	if (!priv->cancel)
 		priv->thread_id = g_idle_add (brasero_libisofs_create_volume_thread_finished, self);
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+
 	g_thread_exit (NULL);
 
 	return NULL;
@@ -881,14 +893,16 @@
 		priv->ctx = NULL;
 	}
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread) {
 		if (priv->libburn_src)
 			priv->libburn_src->cancel (priv->libburn_src);
 
 		priv->cancel = 1;
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
 		priv->cancel = 0;
 	}
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->thread_id) {
 		g_source_remove (priv->thread_id);
@@ -929,7 +943,13 @@
 
 static void
 brasero_libisofs_init (BraseroLibisofs *obj)
-{ }
+{
+	BraseroLibisofsPrivate *priv;
+
+	priv = BRASERO_LIBISOFS_PRIVATE (obj);
+	priv->mutex = g_mutex_new ();
+	priv->cond = g_cond_new ();
+}
 
 static void
 brasero_libisofs_clean_output (BraseroLibisofs *self)
@@ -951,12 +971,24 @@
 brasero_libisofs_finalize (GObject *object)
 {
 	BraseroLibisofs *cobj;
+	BraseroLibisofsPrivate *priv;
 
 	cobj = BRASERO_LIBISOFS (object);
+	priv = BRASERO_LIBISOFS_PRIVATE (object);
 
 	brasero_libisofs_stop_real (cobj);
 	brasero_libisofs_clean_output (cobj);
 
+	if (priv->mutex) {
+		g_mutex_free (priv->mutex);
+		priv->mutex = NULL;
+	}
+
+	if (priv->cond) {
+		g_cond_free (priv->cond);
+		priv->cond = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 

Modified: trunk/src/plugins/local-track/burn-local-image.c
==============================================================================
--- trunk/src/plugins/local-track/burn-local-image.c	(original)
+++ trunk/src/plugins/local-track/burn-local-image.c	Wed Dec 31 13:39:33 2008
@@ -67,6 +67,8 @@
 
 	guint thread_id;
 	GThread *thread;
+	GMutex *mutex;
+	GCond *cond;
 
 	GSList *src_list;
 	GSList *dest_list;
@@ -760,7 +762,12 @@
 	if (!g_cancellable_is_cancelled (priv->cancel))
 		priv->thread_id = g_idle_add ((GSourceFunc) brasero_local_track_thread_finished, self);
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+
 	g_thread_exit (NULL);
 
 	return NULL;
@@ -985,8 +992,10 @@
 		g_cancellable_cancel (priv->cancel);
 	}
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread)
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->cancel) {
 		/* unref it after the thread has stopped */
@@ -1037,6 +1046,18 @@
 static void
 brasero_local_track_finalize (GObject *object)
 {
+	BraseroLocalTrackPrivate *priv = BRASERO_LOCAL_TRACK_PRIVATE (object);
+
+	if (priv->mutex) {
+		g_mutex_free (priv->mutex);
+		priv->mutex = NULL;
+	}
+
+	if (priv->cond) {
+		g_cond_free (priv->cond);
+		priv->cond = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -1057,7 +1078,12 @@
 
 static void
 brasero_local_track_init (BraseroLocalTrack *obj)
-{ }
+{
+	BraseroLocalTrackPrivate *priv = BRASERO_LOCAL_TRACK_PRIVATE (obj);
+
+	priv->mutex = g_mutex_new ();
+	priv->cond = g_cond_new ();
+}
 
 static BraseroBurnResult
 brasero_local_track_export_caps (BraseroPlugin *plugin, gchar **error)

Modified: trunk/src/plugins/local-track/burn-uri.c
==============================================================================
--- trunk/src/plugins/local-track/burn-uri.c	(original)
+++ trunk/src/plugins/local-track/burn-uri.c	Wed Dec 31 13:39:33 2008
@@ -51,6 +51,8 @@
 
 	guint thread_id;
 	GThread *thread;
+	GMutex *mutex;
+	GCond *cond;
 
 	GError *error;
 };
@@ -343,7 +345,12 @@
 	 if (!g_cancellable_is_cancelled (priv->cancel))
 		priv->thread_id = g_idle_add ((GSourceFunc) brasero_burn_uri_thread_finished, self);
 
+	/* End thread */
+	g_mutex_lock (priv->mutex);
 	priv->thread = NULL;
+	g_cond_signal (priv->cond);
+	g_mutex_unlock (priv->mutex);
+ 
 	g_thread_exit (NULL);
 
 	return NULL;
@@ -465,7 +472,7 @@
 
 static BraseroBurnResult
 brasero_burn_uri_stop (BraseroJob *job,
-			  GError **error)
+		       GError **error)
 {
 	BraseroBurnURIPrivate *priv = BRASERO_BURN_URI_PRIVATE (job);
 
@@ -474,8 +481,10 @@
 		g_cancellable_cancel (priv->cancel);
 	}
 
+	g_mutex_lock (priv->mutex);
 	if (priv->thread)
-		g_thread_join (priv->thread);
+		g_cond_wait (priv->cond, priv->mutex);
+	g_mutex_unlock (priv->mutex);
 
 	if (priv->cancel) {
 		/* unref it after the thread has stopped */
@@ -499,6 +508,18 @@
 static void
 brasero_burn_uri_finalize (GObject *object)
 {
+	BraseroBurnURIPrivate *priv = BRASERO_BURN_URI_PRIVATE (object);
+
+	if (priv->mutex) {
+		g_mutex_free (priv->mutex);
+		priv->mutex = NULL;
+	}
+
+	if (priv->cond) {
+		g_cond_free (priv->cond);
+		priv->cond = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -519,7 +540,12 @@
 
 static void
 brasero_burn_uri_init (BraseroBurnURI *obj)
-{ }
+{
+	BraseroBurnURIPrivate *priv = BRASERO_BURN_URI_PRIVATE (obj);
+
+	priv->mutex = g_mutex_new ();
+	priv->cond = g_cond_new ();
+}
 
 static BraseroBurnResult
 brasero_burn_uri_export_caps (BraseroPlugin *plugin, gchar **error)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]