brasero r1669 - in trunk: . src/plugins/checksum src/plugins/dvdcss src/plugins/libburnia src/plugins/local-track
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r1669 - in trunk: . src/plugins/checksum src/plugins/dvdcss src/plugins/libburnia src/plugins/local-track
- Date: Wed, 31 Dec 2008 13:39:33 +0000 (UTC)
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]