From 22589203bd87e975de65dbce5b94e15590bbefe5 Mon Sep 17 00:00:00 2001 From: barbieri Date: Wed, 8 Apr 2009 18:25:02 +0000 Subject: [PATCH] eina_stringshare_replace() gets in! 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 | 1 + src/include/eina_inline_stringshare.x | 43 +++++++++++++++++++++++++++++++++++ src/include/eina_stringshare.h | 5 +++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/include/eina_inline_stringshare.x diff --git a/src/include/Makefile.am b/src/include/Makefile.am index b8fbbf4..64b5782 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -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 index 0000000..68188f0 --- /dev/null +++ b/src/include/eina_inline_stringshare.x @@ -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 . + */ + +#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_ */ diff --git a/src/include/eina_stringshare.h b/src/include/eina_stringshare.h index f760f0e..f59844d 100644 --- a/src/include/eina_stringshare.h +++ b/src/include/eina_stringshare.h @@ -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" + /** * @} */ -- 2.7.4