From: Enlightenment S. <no-...@en...> - 2008-11-04 16:25:16
|
Log: Add and use eina_stringshare_ref(). This is a faster "add", if we know we're using a shared string we know the node without any need to search it, just increment reference and exit. Author: barbieri Date: 2008-11-04 08:25:12 -0800 (Tue, 04 Nov 2008) New Revision: 37458 Modified: trunk/e/src/bin/e_fm.c trunk/eina/src/include/eina_stringshare.h trunk/eina/src/lib/eina_stringshare.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2008-11-04 15:54:38 UTC (rev 37457) +++ trunk/e/src/bin/e_fm.c 2008-11-04 16:25:12 UTC (rev 37458) @@ -5163,7 +5163,7 @@ ) { char buf[4096]; - char *dev = eina_stringshare_add(ic->sd->dev); + const char *dev = eina_stringshare_ref(ic->sd->dev); snprintf(buf, sizeof(buf), "%s/%s", ic->sd->path, ic->info.file); e_fm2_path_set(ic->sd->obj, dev, buf); @@ -5225,7 +5225,7 @@ ) { char buf[4096]; - char *dev = eina_stringshare_add(ic->sd->dev); + const char *dev = eina_stringshare_ref(ic->sd->dev); snprintf(buf, sizeof(buf), "%s/%s", ic->sd->path, ic->info.file); e_fm2_path_set(ic->sd->obj, dev, buf); Modified: trunk/eina/src/include/eina_stringshare.h =================================================================== --- trunk/eina/src/include/eina_stringshare.h 2008-11-04 15:54:38 UTC (rev 37457) +++ trunk/eina/src/include/eina_stringshare.h 2008-11-04 16:25:12 UTC (rev 37458) @@ -68,6 +68,7 @@ EAPI int eina_stringshare_init(void); EAPI int eina_stringshare_shutdown(void); EAPI const char *eina_stringshare_add(const char *str); +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); EAPI void eina_stringshare_dump(void); Modified: trunk/eina/src/lib/eina_stringshare.c =================================================================== --- trunk/eina/src/lib/eina_stringshare.c 2008-11-04 15:54:38 UTC (rev 37457) +++ trunk/eina/src/lib/eina_stringshare.c 2008-11-04 16:25:12 UTC (rev 37458) @@ -962,6 +962,51 @@ } /** + * Increment references of the given shared string. + * + * This is similar to eina_stringshare_add(), but it's faster since it will + * avoid lookups if possible, but on the down side it requires the parameter + * to be shared before, in other words, it must be the return of a previous + * eina_stringshare_add(). + * + * There is no unref since this is the work of eina_stringshare_del(). + */ +EAPI const char * +eina_stringshare_ref(const char *str) +{ + Eina_Stringshare_Node *node; + int slen; + + if (!str) return; + + /* special cases */ + if (str[0] == '\0') slen = 0; + else if (str[1] == '\0') slen = 1; + else if (str[2] == '\0') slen = 2; + else if (str[3] == '\0') slen = 3; + else slen = 4; /* handled later */ + + if (slen < 2) + { + _eina_stringshare_population_add(slen); + return str; + } + else if (slen < 4) + { + _eina_stringshare_population_add(slen); + return _eina_stringshare_small_add(str, slen); + } + + node = _eina_stringshare_node_from_str(str); + node->references++; + + _eina_stringshare_population_add(node->length); + + return str; +} + + +/** * @brief Note that the given string has lost an instance. * * @param str string The given string. |