Author: post
Date: 2012-02-17 20:36:23 +0100 (Fri, 17 Feb 2012)
New Revision: 4138

Modified:
   trunk/plugins/dcp/dcp.c
Log:
Add recursive lock to DCP to avoid clashes between new settings (profiles) and 
rendering thread.

Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c     2012-02-17 17:14:05 UTC (rev 4137)
+++ trunk/plugins/dcp/dcp.c     2012-02-17 19:36:23 UTC (rev 4138)
@@ -51,6 +51,7 @@
 static void free_dcp_profile(RSDcp *dcp);
 static void set_prophoto_wb(RSDcp *dcp, gfloat warmth, gfloat tint);
 static void calculate_huesat_maps(RSDcp *dcp, gfloat temp);
+static GStaticRecMutex dcp_mutex = G_STATIC_REC_MUTEX_INIT;
 
 G_MODULE_EXPORT void
 rs_plugin_load(RSPlugin *plugin)
@@ -289,7 +290,9 @@
        }
 
        if (changed)
+       {
                rs_filter_changed(RS_FILTER(dcp), RS_FILTER_CHANGED_PIXELDATA);
+       }
 }
 
 /* This will free all ressources that are related to a DCP profile */
@@ -411,6 +414,7 @@
        RSDcp *dcp = RS_DCP(object);
        RSFilter *filter = RS_FILTER(dcp);
        gpointer temp;
+       gboolean changed = FALSE;
 
        switch (property_id)
        {
@@ -431,33 +435,39 @@
                        g_object_weak_ref(G_OBJECT(dcp->settings), 
settings_weak_notify, dcp);
                        break;
                case PROP_PROFILE:
+                       g_static_rec_mutex_lock(&dcp_mutex);
                        read_profile(dcp, g_value_get_object(value));
                        precalc(dcp);
-                       rs_filter_changed(filter, RS_FILTER_CHANGED_PIXELDATA);
+                       changed = TRUE;
+                       g_static_rec_mutex_unlock(&dcp_mutex);
                        break;
                case PROP_READ_OUT_CURVE:
                        temp = g_value_get_object(value);
                        if (temp != dcp->read_out_curve)
-                               rs_filter_changed(RS_FILTER(dcp), 
RS_FILTER_CHANGED_PIXELDATA);
+                               changed = TRUE;
                        dcp->read_out_curve = temp;
                        break;
                case PROP_USE_PROFILE:
+                       g_static_rec_mutex_lock(&dcp_mutex);
                        dcp->use_profile = g_value_get_boolean(value);
                        if (!dcp->use_profile)
                                free_dcp_profile(dcp);
                        else
                                precalc(dcp);
                        break;
+                       g_static_rec_mutex_unlock(&dcp_mutex);
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
+
+       if (changed)
+               rs_filter_changed(filter, RS_FILTER_CHANGED_PIXELDATA);
 }
 
 static void
 settings_weak_notify(gpointer data, GObject *where_the_object_was)
 {
        RSDcp *dcp = RS_DCP(data);
-
        dcp->settings = NULL;
 }
 
@@ -589,6 +599,7 @@
        rs_filter_response_set_image(response, output);
        g_object_unref(output);
 
+       g_static_rec_mutex_lock(&dcp_mutex);
        init_exposure(dcp);
 
        guint i, y_offset, y_per_thread, threaded_h;
@@ -624,6 +635,9 @@
        for(i = 0; threads > 1 && i < threads; i++)
                g_thread_join(t[i].threadid);
 
+       /* Settings can change now */
+       g_static_rec_mutex_unlock(&dcp_mutex);
+
        /* If we must deliver histogram data, do it now */
        if (dcp->read_out_curve)
        {
@@ -1435,13 +1449,14 @@
        }};
 
        /* Camera to ProPhoto */
+       g_static_rec_mutex_lock(&dcp_mutex);
        if (dcp->use_profile)
                matrix3_multiply(&xyz_to_prophoto, &dcp->camera_to_pcs, 
&dcp->camera_to_prophoto); /* verified by SDK */
        if (dcp->huesatmap)
                calc_hsm_constants(dcp->huesatmap, dcp->huesatmap_precalc); 
        if (dcp->looktable)
                calc_hsm_constants(dcp->looktable, dcp->looktable_precalc); 
-       
+       g_static_rec_mutex_unlock(&dcp_mutex);
 }
 
 static void


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to