summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--src/common/array.c111
2 files changed, 71 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index 9064308..0fd0682 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+17-07-14 Cyrille Bagard <nocbos@gmail.com>
+
+ * src/common/array.c:
+ Fix some atomic accesses and a few memory leaks in flat arrays.
+
17-07-13 Cyrille Bagard <nocbos@gmail.com>
* src/analysis/db/items/comment.c:
diff --git a/src/common/array.c b/src/common/array.c
index 36c30a1..ea05e6a 100644
--- a/src/common/array.c
+++ b/src/common/array.c
@@ -28,9 +28,6 @@
#include <endian.h>
#include <glib.h>
#include <malloc.h>
-#ifndef NDEBUG
-# include <stdbool.h>
-#endif
#include <string.h>
@@ -117,6 +114,11 @@ typedef struct _ext_flat_array_t
+/* Verrouille l'accès à une nouvelle adresse d'un tableau. */
+static void relock_flat_array(flat_array_t **, void *);
+
+
+
/******************************************************************************
* *
* Paramètres : array = tableau compressé à modifier. [OUT] *
@@ -131,7 +133,29 @@ typedef struct _ext_flat_array_t
void lock_flat_array(flat_array_t **array)
{
- g_bit_lock((gint *)array, FLAT_ARRAY_LOCK_BIT);
+ g_pointer_bit_lock(array, FLAT_ARRAY_LOCK_BIT);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : array = tableau compressé à modifier. [OUT] *
+* new = nouvelle adresse à traiter atomiquement. *
+* *
+* Description : Verrouille l'accès à une nouvelle adresse d'un tableau. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void relock_flat_array(flat_array_t **array, void *new)
+{
+ g_pointer_bit_lock(&new, FLAT_ARRAY_LOCK_BIT);
+
+ g_atomic_pointer_set(array, new);
}
@@ -150,7 +174,7 @@ void lock_flat_array(flat_array_t **array)
void unlock_flat_array(flat_array_t **array)
{
- g_bit_unlock((gint *)array, FLAT_ARRAY_LOCK_BIT);
+ g_pointer_bit_unlock(array, FLAT_ARRAY_LOCK_BIT);
}
@@ -187,9 +211,7 @@ void reset_flat_array(flat_array_t **array)
free(GET_LONELY_ITEM(*array));
- *array = NULL;
-
- lock_flat_array(array);
+ relock_flat_array(array, NULL);
break;
@@ -202,9 +224,7 @@ void reset_flat_array(flat_array_t **array)
free(extended->items);
free(extended);
- *array = NULL;
-
- lock_flat_array(array);
+ relock_flat_array(array, NULL);
break;
@@ -231,8 +251,9 @@ void reset_flat_array(flat_array_t **array)
void copy_flat_array_items(flat_array_t **src, flat_array_t **dest, size_t size, item_notify_cb notify)
{
void *item; /* Elément manipulé */
+ void *new_single; /* Nouvelle copie crée */
ext_flat_array_t *extended; /* Version de tableau étendue */
- ext_flat_array_t *new; /* Nouvelle copie créée */
+ ext_flat_array_t *new_ext; /* Nouvelle copie créée */
size_t i; /* Boucle de parcours */
assert(!FLAT_ARRAY_IS_LOCKED(*src));
@@ -253,10 +274,10 @@ void copy_flat_array_items(flat_array_t **src, flat_array_t **dest, size_t size,
if (notify != NULL)
notify(item);
- *dest = malloc(size);
- memcpy(*dest, item, size);
+ new_single = malloc(size);
+ memcpy(new_single, item, size);
- lock_flat_array(dest);
+ relock_flat_array(dest, new_single);
}
@@ -264,25 +285,23 @@ void copy_flat_array_items(flat_array_t **src, flat_array_t **dest, size_t size,
{
extended = EXTENDED_ARRAY(*src);
- new = (ext_flat_array_t *)malloc(sizeof(ext_flat_array_t));
+ new_ext = (ext_flat_array_t *)malloc(sizeof(ext_flat_array_t));
- new->items = malloc(extended->count * size);
- new->count = extended->count;
+ new_ext->items = malloc(extended->count * size);
+ new_ext->count = extended->count;
- memcpy(new->items, extended->items, new->count * size);
+ memcpy(new_ext->items, extended->items, new_ext->count * size);
if (notify != NULL)
- for (i = 0; i < new->count; i++)
+ for (i = 0; i < new_ext->count; i++)
{
- item = (void *)(((char *)new->items) + i * size);
+ item = (void *)(((char *)new_ext->items) + i * size);
notify(item);
}
- FLAT_ARRAY_SET_INDEX(new);
-
- *dest = (flat_array_t *)new;
+ FLAT_ARRAY_SET_INDEX(new_ext);
- lock_flat_array(dest);
+ relock_flat_array(dest, new_ext);
}
@@ -350,16 +369,17 @@ size_t count_flat_array_items(const flat_array_t *array)
void add_item_to_flat_array(flat_array_t **array, const void *item, size_t size)
{
+ void *single; /* Copie à un seul élément */
ext_flat_array_t *extended; /* Version de tableau étendue */
assert(FLAT_ARRAY_IS_LOCKED(*array));
if (FLAT_ARRAY_IS_EMPTY(*array))
{
- *array = malloc(size);
- memcpy(*array, item, size);
+ single = malloc(size);
+ memcpy(single, item, size);
- lock_flat_array(array);
+ relock_flat_array(array, single);
}
@@ -372,14 +392,16 @@ void add_item_to_flat_array(flat_array_t **array, const void *item, size_t size)
extended->items = malloc(2 * size);
extended->count = 2;
- memcpy(extended->items, GET_LONELY_ITEM(*array), size);
+ single = GET_LONELY_ITEM(*array);
+
+ memcpy(extended->items, single, size);
memcpy(((char *)extended->items) + size, item, size);
- FLAT_ARRAY_SET_INDEX(extended);
+ free(single);
- *array = (flat_array_t *)extended;
+ FLAT_ARRAY_SET_INDEX(extended);
- lock_flat_array(array);
+ relock_flat_array(array, extended);
}
@@ -416,16 +438,17 @@ void add_item_to_flat_array(flat_array_t **array, const void *item, size_t size)
void insert_item_into_flat_array(flat_array_t **array, void *item, size_t size, __compar_fn_t compar)
{
+ void *single; /* Copie à un seul élément */
ext_flat_array_t *extended; /* Version de tableau étendue */
assert(FLAT_ARRAY_IS_LOCKED(*array));
if (FLAT_ARRAY_IS_EMPTY(*array))
{
- *array = malloc(size);
- memcpy(*array, item, size);
+ single = malloc(size);
+ memcpy(single, item, size);
- lock_flat_array(array);
+ relock_flat_array(array, single);
}
@@ -438,13 +461,15 @@ void insert_item_into_flat_array(flat_array_t **array, void *item, size_t size,
extended->items = malloc(size);
extended->count = 1;
- memcpy(extended->items, GET_LONELY_ITEM(*array), size);
+ single = GET_LONELY_ITEM(*array);
- FLAT_ARRAY_SET_INDEX(extended);
+ memcpy(extended->items, single, size);
- *array = (flat_array_t *)extended;
+ free(single);
- lock_flat_array(array);
+ FLAT_ARRAY_SET_INDEX(extended);
+
+ relock_flat_array(array, extended);
}
@@ -538,9 +563,7 @@ void rem_item_from_flat_array(flat_array_t **array, size_t index, size_t size)
free(GET_LONELY_ITEM(*array));
- *array = NULL;
-
- lock_flat_array(array);
+ relock_flat_array(array, NULL);
break;
@@ -560,9 +583,7 @@ void rem_item_from_flat_array(flat_array_t **array, size_t index, size_t size)
free(extended);
- *array = new;
-
- lock_flat_array(array);
+ relock_flat_array(array, new);
break;