summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2013-02-28 12:09:42 +0000
committerRichard Hughes <richard@hughsie.com>2013-02-28 12:48:38 +0000
commit8c5c26b08f6d83089489e83ac6e3fc7568732006 (patch)
treefefdb5ce9598791f3f58d5d9f381b0a8cd90e4f0
parent511f085b95cc6bf9ad3764a48cbe458766ea4730 (diff)
downloadcolord-8c5c26b08f6d83089489e83ac6e3fc7568732006.tar.gz
libcolord: Switch CdColor to using the GSlice allocator for a modest speedup
GSlice is designed for allocating a large number of small chunks of memory that are the same size. By switching away from g_new0 (which is pretty much, but slower than malloc) we can increase the speed of any program that allocates a large number of color objects without breaking API or ABI. Some broken users of the free functions that assumed the free-function was an explicit GDestroyNotify have to be manually casted, but in the worst case this is an easily detected compile warning that is easily fixed. This commit also has the benefit that the _new() and _free() functions can be used in languages that use the Colord-1.0 GIR, e.g. JavaScript and Python.
-rw-r--r--lib/colord/cd-color.c87
-rw-r--r--lib/colord/cd-color.h14
-rw-r--r--lib/colord/cd-it8.c4
-rw-r--r--src/sensors/cd-sensor-argyll.c2
-rw-r--r--src/sensors/cd-sensor-colorhug.c2
-rw-r--r--src/sensors/cd-sensor-dtp94.c2
-rw-r--r--src/sensors/cd-sensor-dummy.c2
-rw-r--r--src/sensors/cd-sensor-huey.c2
-rw-r--r--src/sensors/cd-sensor-munki.c2
9 files changed, 102 insertions, 15 deletions
diff --git a/lib/colord/cd-color.c b/lib/colord/cd-color.c
index 922d722..025ecb3 100644
--- a/lib/colord/cd-color.c
+++ b/lib/colord/cd-color.c
@@ -144,6 +144,93 @@ cd_color_yxy_get_type (void)
}
/**
+ * cd_color_xyz_new:
+ *
+ * Allocates a color value.
+ *
+ * Return value: A newly allocated #CdColorXYZ object
+ *
+ * Since: 0.1.0
+ **/
+CdColorXYZ *
+cd_color_xyz_new (void)
+{
+ return g_slice_new0 (CdColorXYZ);
+}
+
+/**
+ * cd_color_rgb_new:
+ *
+ * Allocates a color value.
+ *
+ * Return value: A newly allocated #CdColorRGB object
+ *
+ * Since: 0.1.0
+ **/
+CdColorRGB *
+cd_color_rgb_new (void)
+{
+ return g_slice_new0 (CdColorRGB);
+}
+
+/**
+ * cd_color_yxy_new:
+ *
+ * Allocates a color value.
+ *
+ * Return value: A newly allocated #CdColorYxy object
+ *
+ * Since: 0.1.0
+ **/
+CdColorYxy *
+cd_color_yxy_new (void)
+{
+ return g_slice_new0 (CdColorYxy);
+}
+
+/**
+ * cd_color_xyz_free:
+ * @src: the color object
+ *
+ * Deallocates a color value.
+ *
+ * Since: 0.1.0
+ **/
+void
+cd_color_xyz_free (CdColorXYZ *src)
+{
+ g_slice_free (CdColorXYZ, src);
+}
+
+/**
+ * cd_color_rgb_free:
+ * @src: the color object
+ *
+ * Deallocates a color value.
+ *
+ * Since: 0.1.0
+ **/
+void
+cd_color_rgb_free (CdColorRGB *src)
+{
+ g_slice_free (CdColorRGB, src);
+}
+
+/**
+ * cd_color_yxy_free:
+ * @src: the color object
+ *
+ * Deallocates a color value.
+ *
+ * Since: 0.1.0
+ **/
+void
+cd_color_yxy_free (CdColorYxy *src)
+{
+ g_slice_free (CdColorYxy, src);
+}
+
+/**
* cd_color_xyz_set:
* @dest: the destination color
* @X: component value
diff --git a/lib/colord/cd-color.h b/lib/colord/cd-color.h
index 1eb2cd5..32dd6f7 100644
--- a/lib/colord/cd-color.h
+++ b/lib/colord/cd-color.h
@@ -67,13 +67,13 @@ GType cd_color_xyz_get_type (void);
GType cd_color_rgb_get_type (void);
GType cd_color_yxy_get_type (void);
-/* allocate and deallocate helpers */
-#define cd_color_xyz_new() g_new0 (CdColorXYZ, 1)
-#define cd_color_rgb_new() g_new0 (CdColorRGB, 1)
-#define cd_color_yxy_new() g_new0 (CdColorYxy, 1)
-#define cd_color_xyz_free g_free
-#define cd_color_rgb_free g_free
-#define cd_color_yxy_free g_free
+CdColorXYZ *cd_color_xyz_new (void);
+CdColorRGB *cd_color_rgb_new (void);
+CdColorYxy *cd_color_yxy_new (void);
+void cd_color_xyz_free (CdColorXYZ *src);
+void cd_color_rgb_free (CdColorRGB *src);
+void cd_color_yxy_free (CdColorYxy *src);
+
CdColorXYZ *cd_color_xyz_dup (const CdColorXYZ *src);
CdColorRGB *cd_color_rgb_dup (const CdColorRGB *src);
CdColorYxy *cd_color_yxy_dup (const CdColorYxy *src);
diff --git a/lib/colord/cd-it8.c b/lib/colord/cd-it8.c
index 450d17e..7e46bb9 100644
--- a/lib/colord/cd-it8.c
+++ b/lib/colord/cd-it8.c
@@ -1337,8 +1337,8 @@ cd_it8_init (CdIt8 *it8)
{
it8->priv = CD_IT8_GET_PRIVATE (it8);
- it8->priv->array_rgb = g_ptr_array_new_with_free_func (cd_color_rgb_free);
- it8->priv->array_xyz = g_ptr_array_new_with_free_func (cd_color_xyz_free);
+ it8->priv->array_rgb = g_ptr_array_new_with_free_func ((GDestroyNotify) cd_color_rgb_free);
+ it8->priv->array_xyz = g_ptr_array_new_with_free_func ((GDestroyNotify) cd_color_xyz_free);
it8->priv->options = g_ptr_array_new_with_free_func (g_free);
/* ensure the remote errors are registered */
diff --git a/src/sensors/cd-sensor-argyll.c b/src/sensors/cd-sensor-argyll.c
index e30d25b..84a705f 100644
--- a/src/sensors/cd-sensor-argyll.c
+++ b/src/sensors/cd-sensor-argyll.c
@@ -72,7 +72,7 @@ cd_sensor_get_sample_state_finish (CdSensorAsyncState *state,
if (state->ret) {
g_simple_async_result_set_op_res_gpointer (state->res,
state->sample,
- cd_color_xyz_free);
+ (GDestroyNotify) cd_color_xyz_free);
} else {
g_simple_async_result_set_from_error (state->res, error);
}
diff --git a/src/sensors/cd-sensor-colorhug.c b/src/sensors/cd-sensor-colorhug.c
index 00ab989..5f47fb8 100644
--- a/src/sensors/cd-sensor-colorhug.c
+++ b/src/sensors/cd-sensor-colorhug.c
@@ -67,7 +67,7 @@ cd_sensor_colorhug_get_sample_state_finish (CdSensorAsyncState *state,
if (state->ret) {
g_simple_async_result_set_op_res_gpointer (state->res,
state->sample,
- cd_color_xyz_free);
+ (GDestroyNotify) cd_color_xyz_free);
} else {
g_simple_async_result_set_from_error (state->res, error);
}
diff --git a/src/sensors/cd-sensor-dtp94.c b/src/sensors/cd-sensor-dtp94.c
index a7d38e5..c8bf4a1 100644
--- a/src/sensors/cd-sensor-dtp94.c
+++ b/src/sensors/cd-sensor-dtp94.c
@@ -65,7 +65,7 @@ cd_sensor_dtp94_get_sample_state_finish (CdSensorAsyncState *state,
if (state->ret) {
g_simple_async_result_set_op_res_gpointer (state->res,
state->sample,
- cd_color_xyz_free);
+ (GDestroyNotify) cd_color_xyz_free);
} else {
g_simple_async_result_set_from_error (state->res, error);
}
diff --git a/src/sensors/cd-sensor-dummy.c b/src/sensors/cd-sensor-dummy.c
index 972a680..8d9ce99 100644
--- a/src/sensors/cd-sensor-dummy.c
+++ b/src/sensors/cd-sensor-dummy.c
@@ -58,7 +58,7 @@ cd_sensor_get_sample_state_finish (CdSensorAsyncState *state,
if (state->ret) {
g_simple_async_result_set_op_res_gpointer (state->res,
state->sample,
- cd_color_xyz_free);
+ (GDestroyNotify) cd_color_xyz_free);
} else {
g_simple_async_result_set_from_error (state->res, error);
}
diff --git a/src/sensors/cd-sensor-huey.c b/src/sensors/cd-sensor-huey.c
index 47767e8..052cc99 100644
--- a/src/sensors/cd-sensor-huey.c
+++ b/src/sensors/cd-sensor-huey.c
@@ -63,7 +63,7 @@ cd_sensor_huey_get_sample_state_finish (CdSensorAsyncState *state,
if (state->ret) {
g_simple_async_result_set_op_res_gpointer (state->res,
state->sample,
- cd_color_xyz_free);
+ (GDestroyNotify) cd_color_xyz_free);
} else {
g_simple_async_result_set_from_error (state->res, error);
}
diff --git a/src/sensors/cd-sensor-munki.c b/src/sensors/cd-sensor-munki.c
index 43049fb..7e6e7bb 100644
--- a/src/sensors/cd-sensor-munki.c
+++ b/src/sensors/cd-sensor-munki.c
@@ -309,7 +309,7 @@ cd_sensor_munki_get_sample_state_finish (CdSensorAsyncState *state,
if (state->ret) {
g_simple_async_result_set_op_res_gpointer (state->res,
state->sample,
- cd_color_xyz_free);
+ (GDestroyNotify) cd_color_xyz_free);
} else {
g_simple_async_result_set_from_error (state->res, error);
}