Mercurial > pidgin.yaz
view src/prefix.h @ 11719:109ee3bfeac5
[gaim-migrate @ 14010]
SF Patch #1333770 from corfe83
"Many times in gaim we use the function
g_slist_remove(list,node->data) to remove an element
from a GSList. If we already have the pointer to the
node we want to delete, it is faster to send it the
pointer to the node to delete rather than the data of
the node (we can do this by calling
g_slist_delete_link(list,node)). This change was made
while looking at glib's documentation and the code in
glib's gslist.c.
This is because as the remove/delete function traverses
each node in the list, it doesn't need to spend an
extra memory access to retrieve the data for each
element in the node it is traversing and then compare,
it can simply compare the pointer. In my tests outside
of gaim, this makes a big difference if the node you
are deleting is at a high index in the list. However,
even if you're deleting the first node, it about breaks
even.
So, I've found each case in gaim where we are calling
g_slist_remove, and we already have the pointer to the
appropriate node to delete (this is often the case when
we're doing a for or while loop on a GSList). I've then
replaced it with the appropriate call to
g_slist_delete_link. I, however, didn't do this in
situations where we are explicitly removing the first
element in the list, because in those situations it is
an unnecessary change.
There should be no difference in behavior, but just in
case I've tried running it with valgrind, which reports
the same number of memory leaks after my patch as
before my patch. Of course, I can't guarantee that my
normal behavior on gaim is hitting all the functions
I've changed, but in general testing it Works For Me (tm)."
As with the last patch, this one may not have a practical performance impact (or maybe it does, I have no idea), but it's not worse for any case. Given two ways of doing things where one is always at least as fast and may be faster under some cases, I like to prefer that faster way. This doesn't make the code any uglier, so I'm applying.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sat, 22 Oct 2005 20:48:18 +0000 |
parents | 7f487c725a90 |
children | ca559e2b1d0a |
line wrap: on
line source
/* * I made the following modifications, be sure to readd these when * upgrading these files. * * Added this comment. * Added "gaim_ ## " to the namespace * Changed the lib macro to use /lib/gaim instead of just /lib * (why does gaim do that in the -DLIBDIR autoconf thing anyway?) * */ /* * BinReloc - a library for creating relocatable executables * Written by: Mike Hearn <mike@theoretic.com> * Hongli Lai <h.lai@chello.nl> * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * See http://autopackage.org/docs/binreloc/ for * more information and how to use this. * * NOTE: if you're using C++ and are getting "undefined reference * to br_*", try renaming prefix.c to prefix.cpp */ #ifndef _PREFIX_H_ #define _PREFIX_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* WARNING, BEFORE YOU MODIFY PREFIX.C: * * If you make changes to any of the functions in prefix.c, you MUST * change the BR_NAMESPACE macro. * This way you can avoid symbol table conflicts with other libraries * that also happen to use BinReloc. * * Example: * #define BR_NAMESPACE(funcName) foobar_ ## funcName * --> expands br_locate to foobar_br_locate */ #undef BR_NAMESPACE #define BR_NAMESPACE(funcName) gaim_ ## funcName #ifdef ENABLE_BINRELOC #define br_thread_local_store BR_NAMESPACE(br_thread_local_store) #define br_locate BR_NAMESPACE(br_locate) #define br_locate_prefix BR_NAMESPACE(br_locate_prefix) #define br_prepend_prefix BR_NAMESPACE(br_prepend_prefix) #ifndef BR_NO_MACROS /* These are convience macros that replace the ones usually used in Autoconf/Automake projects */ #undef SELFPATH #undef PREFIX #undef PREFIXDIR #undef BINDIR #undef SBINDIR #undef DATADIR #undef LIBDIR #undef LIBEXECDIR #undef ETCDIR #undef SYSCONFDIR #undef CONFDIR #undef LOCALEDIR #define SELFPATH (br_thread_local_store (br_locate ((void *) ""))) #define PREFIX (br_thread_local_store (br_locate_prefix ((void *) ""))) #define PREFIXDIR (br_thread_local_store (br_locate_prefix ((void *) ""))) #define BINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/bin"))) #define SBINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/sbin"))) #define DATADIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share"))) #define LIBDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/lib/gaim"))) #define LIBEXECDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/libexec"))) #define ETCDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define SYSCONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define CONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define LOCALEDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share/locale"))) #endif /* BR_NO_MACROS */ /* The following functions are used internally by BinReloc and shouldn't be used directly in applications. */ char *br_locate (void *symbol); char *br_locate_prefix (void *symbol); char *br_prepend_prefix (void *symbol, char *path); #endif /* ENABLE_BINRELOC */ const char *br_thread_local_store (char *str); /* These macros and functions are not guarded by the ENABLE_BINRELOC * macro because they are portable. You can use these functions. */ #define br_strcat BR_NAMESPACE(br_strcat) #define br_extract_dir BR_NAMESPACE(br_extract_dir) #define br_extract_prefix BR_NAMESPACE(br_extract_prefix) #define br_set_locate_fallback_func BR_NAMESPACE(br_set_locate_fallback_func) #ifndef BR_NO_MACROS /* Convenience functions for concatenating paths */ /* Each time you call one, the previous result will be freed. So don't do this: * * some_function( BR_DATADIR("/one"), BR_DATADIR("/two") ) * * as the first parameter will now be bogus! */ #define BR_SELFPATH(suffix) (br_thread_local_store (br_strcat (SELFPATH, suffix))) #define BR_PREFIX(suffix) (br_thread_local_store (br_strcat (PREFIX, suffix))) #define BR_PREFIXDIR(suffix) (br_thread_local_store (br_strcat (BR_PREFIX, suffix))) #define BR_BINDIR(suffix) (br_thread_local_store (br_strcat (BINDIR, suffix))) #define BR_SBINDIR(suffix) (br_thread_local_store (br_strcat (SBINDIR, suffix))) #define BR_DATADIR(suffix) (br_thread_local_store (br_strcat (DATADIR, suffix))) #define BR_LIBDIR(suffix) (br_thread_local_store (br_strcat (LIBDIR, suffix))) #define BR_LIBEXECDIR(suffix) (br_thread_local_store (br_strcat (LIBEXECDIR, suffix))) #define BR_ETCDIR(suffix) (br_thread_local_store (br_strcat (ETCDIR, suffix))) #define BR_SYSCONFDIR(suffix) (br_thread_local_store (br_strcat (SYSCONFDIR, suffix))) #define BR_CONFDIR(suffix) (br_thread_local_store (br_strcat (CONFDIR, suffix))) #define BR_LOCALEDIR(suffix) (br_thread_local_store (br_strcat (LOCALEDIR, suffix))) #endif char *br_strcat (const char *str1, const char *str2); char *br_extract_dir (const char *path); char *br_extract_prefix(const char *path); typedef char *(*br_locate_fallback_func) (void *symbol, void *data); void br_set_locate_fallback_func (br_locate_fallback_func func, void *data); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _PREFIX_H_ */