eina_stringshare_replace() gets in!
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 8 Apr 2009 18:25:02 +0000 (18:25 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 8 Apr 2009 18:25:02 +0000 (18:25 +0000)
I was replicating this code in many places, it should go into eina itself.

It's the right way to change strings that you don't know are
stringshared before, since it will first add a reference and then
remove, making it impossible to have references to go 0 and string
being released before adding new references, fixing the following
possible problem:

   x = eina_stringshare_add("x");
   replace(x, x);

   then:
   incorrect_replace(const char **b, const char *a) {
      eina_stringshare_del(*b); /* reference gets to 0 */
      eina_stringshare_add(a); /* BUG!!! */
      *b = a;
   }

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@39903 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/Makefile.am
src/include/eina_inline_stringshare.x [new file with mode: 0644]
src/include/eina_stringshare.h

index b8fbbf4..64b5782 100644 (file)
@@ -19,6 +19,7 @@ eina_counter.h \
 eina_inline_array.x \
 eina_magic.h \
 eina_stringshare.h \
+eina_inline_stringshare.x \
 eina_inline_list.x \
 eina_accessor.h \
 eina_convert.h \
diff --git a/src/include/eina_inline_stringshare.x b/src/include/eina_inline_stringshare.x
new file mode 100644 (file)
index 0000000..68188f0
--- /dev/null
@@ -0,0 +1,43 @@
+/* EINA - EFL data type library
+ * Copyright (C) 2002-2008 Gustavo Sverzut Barbieri
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;
+ * if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EINA_STRINGSHARE_INLINE_H_
+#define EINA_STRINGSHARE_INLINE_H_
+
+/**
+ * @addtogroup Eina_Stringshare_Group Stringshare
+ *
+ * @{
+ */
+
+static inline Eina_Bool
+eina_stringshare_replace(const char **p_str, const char *new)
+{
+   new = eina_stringshare_add(new);
+   eina_stringshare_del(*p_str);
+   if (*p_str == new)
+     return 0;
+   *p_str = new;
+   return 1;
+}
+
+/**
+ * @}
+ */
+
+#endif /* EINA_STRINGSHARE_INLINE_H_ */
index f760f0e..f59844d 100644 (file)
@@ -72,7 +72,10 @@ EAPI const char *eina_stringshare_ref(const char *str);
 EAPI void eina_stringshare_del(const char *str);
 EAPI int eina_stringshare_strlen(const char *str) EINA_CONST EINA_WARN_UNUSED_RESULT;
 EAPI void eina_stringshare_dump(void);
-    
+
+
+#include "eina_inline_stringshare.x"
+
 /**
  * @}
  */