eina: make eina_cow_free reset the pointer to the default read only value.
authorCedric Bail <cedric.bail@samsung.com>
Mon, 4 Nov 2013 03:45:25 +0000 (12:45 +0900)
committerCedric Bail <cedric.bail@samsung.com>
Mon, 4 Nov 2013 03:45:25 +0000 (12:45 +0900)
src/lib/eina/eina_cow.c
src/lib/eina/eina_cow.h

index 64c1b3f..a2c4e3f 100644 (file)
@@ -78,7 +78,7 @@ struct _Eina_Cow_GC
 #endif
 
    Eina_Cow_Ptr *ref;
-   const void * const *dst;
+   const void **dst;
 };
 
 struct _Eina_Cow
@@ -228,7 +228,7 @@ _eina_cow_togc_del(Eina_Cow *cow, Eina_Cow_Ptr *ref)
 static void
 _eina_cow_togc_add(Eina_Cow *cow,
                    Eina_Cow_Ptr *ref,
-                   const Eina_Cow_Data * const * dst)
+                   const Eina_Cow_Data ** dst)
 {
    Eina_Cow_GC *gc;
 
@@ -255,7 +255,7 @@ _eina_cow_togc_add(Eina_Cow *cow,
 
 static void
 _eina_cow_gc(Eina_Cow *cow, Eina_Cow_Ptr *ref,
-             const Eina_Cow_Data * const *dst,
+             const Eina_Cow_Data **dst,
              void *data)
 {
    void *match;
@@ -270,10 +270,10 @@ _eina_cow_gc(Eina_Cow *cow, Eina_Cow_Ptr *ref,
 #ifndef NVALGRIND
         VALGRIND_MAKE_MEM_DEFINED(ref, sizeof (*ref));
 #endif
-        *((void**)dst) = match;
         ref->refcount++;
 
-        eina_cow_free(cow, data);
+        eina_cow_free(cow, dst);
+        *dst = match;
 
 #ifndef NVALGRIND
         VALGRIND_MAKE_MEM_NOACCESS(ref, sizeof (*ref));
@@ -413,7 +413,7 @@ eina_cow_alloc(Eina_Cow *cow)
 }
 
 EAPI void
-eina_cow_free(Eina_Cow *cow, const Eina_Cow_Data *data)
+eina_cow_free(Eina_Cow *cow, const Eina_Cow_Data **data)
 {
    Eina_Cow_Ptr *ref;
 
@@ -421,15 +421,17 @@ eina_cow_free(Eina_Cow *cow, const Eina_Cow_Data *data)
    EINA_COW_MAGIC_CHECK(cow);
 #endif
 
-   if (!data) return;
-   if (cow->default_value == data) return;
+   if (!data || !*data) return;
+   if (cow->default_value == *data) return;
 
-   ref = EINA_COW_PTR_GET(data);
+   ref = EINA_COW_PTR_GET(*data);
 #ifndef NVALGRIND
    VALGRIND_MAKE_MEM_DEFINED(ref, sizeof (*ref));
 #endif
    ref->refcount--;
 
+   *data = (Eina_Cow_Data*) cow->default_value;
+
    if (ref->refcount > 0)
      {
 #ifndef NVALGRIND
@@ -441,7 +443,7 @@ eina_cow_free(Eina_Cow *cow, const Eina_Cow_Data *data)
 #ifdef EINA_COW_MAGIC_ON
    EINA_MAGIC_SET(ref, EINA_MAGIC_NONE);
 #endif
-   _eina_cow_hash_del(cow, data, ref);
+   _eina_cow_hash_del(cow, *data, ref);
    _eina_cow_togc_del(cow, ref);
    eina_mempool_free(cow->pool, (void*) ref);
 }
@@ -558,7 +560,7 @@ eina_cow_done(Eina_Cow *cow,
    VALGRIND_MAKE_MEM_DEFINED(ref, sizeof (*ref));
 #endif
 
-   _eina_cow_togc_add(cow, ref, dst);
+   _eina_cow_togc_add(cow, ref, (const Eina_Cow_Data **) dst);
 }
 
 EAPI void
@@ -590,7 +592,7 @@ eina_cow_memcpy(Eina_Cow *cow,
 #endif
      }
 
-   eina_cow_free(cow, *dst);
+   eina_cow_free(cow, (const Eina_Cow_Data**) dst);
 
    *((const void**)dst) = src;
 }
index 875e1fe..10cb34d 100644 (file)
@@ -79,8 +79,12 @@ EAPI const Eina_Cow_Data *eina_cow_alloc(Eina_Cow *cow) EINA_WARN_UNUSED_RESULT;
 /**
  * @brief Free a pointer from the pool.
  * @param cow The pool to gave back memory to.
+ * @param data The data to give back.
+ *
+ * @note To simplify the caller code *data will point to the default
+ * read only state after the call to this function.
  */
-EAPI void eina_cow_free(Eina_Cow *cow, const Eina_Cow_Data *data);
+EAPI void eina_cow_free(Eina_Cow *cow, const Eina_Cow_Data **data);
 
 /**
  * @brief Get a writable pointer from a const pointer.