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
This commit is contained in:
Gustavo Sverzut Barbieri 2009-04-08 18:25:02 +00:00
parent adf3a95ddc
commit 2e9a9a9700
3 changed files with 48 additions and 1 deletions

View 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 \

View File

@ -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_ */

View 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"
/**
* @}
*/