From 2e9a9a97005bfbed438bf17a1a87351614985b18 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut 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; } SVN revision: 39903 --- legacy/eina/src/include/Makefile.am | 1 + .../src/include/eina_inline_stringshare.x | 43 +++++++++++++++++++ legacy/eina/src/include/eina_stringshare.h | 5 ++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 legacy/eina/src/include/eina_inline_stringshare.x diff --git a/legacy/eina/src/include/Makefile.am b/legacy/eina/src/include/Makefile.am index b8fbbf4877..64b5782c9d 100644 --- a/legacy/eina/src/include/Makefile.am +++ b/legacy/eina/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/legacy/eina/src/include/eina_inline_stringshare.x b/legacy/eina/src/include/eina_inline_stringshare.x new file mode 100644 index 0000000000..68188f0a0e --- /dev/null +++ b/legacy/eina/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/legacy/eina/src/include/eina_stringshare.h b/legacy/eina/src/include/eina_stringshare.h index f760f0ed19..f59844dd0d 100644 --- a/legacy/eina/src/include/eina_stringshare.h +++ b/legacy/eina/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" + /** * @} */