On Tue, Sep 28, 2010 at 05:01:09PM +0200, Lars Ellenberg wrote: > # HG changeset patch > # User Lars Ellenberg <l...@linbit.com> > # Date 1285672353 -7200 > # Node ID 066f484922ec549f84ea59c138d4e6cf16b2e14b > # Parent 5e309d18204045b882616fedeed7e315fc4907bf > Low: add and use UNCONST_CAST_POINTER macro to avoid -Wqual-cast warnings > > This also removes unnecessary memcopy and excessive stack usage of 256k on > each > invokation of cl_msg_list_add_string, called e.g. from lrmd add_rid_to_msg(). > > diff -r 5e309d182040 -r 066f484922ec include/lha_internal.h > --- a/include/lha_internal.h Tue Sep 28 13:06:35 2010 +0200 > +++ b/include/lha_internal.h Tue Sep 28 13:12:33 2010 +0200 > @@ -136,6 +136,15 @@ > #define POINTER_TO_SIZE_T(p) ((size_t)(p)) /*pointer cast as size_t*/ > #define POINTER_TO_SSIZE_T(p) ((ssize_t)(p)) /*pointer cast as > ssize_t*/ > #define POINTER_TO_ULONG(p) ((unsigned long)(p)) /*pointer cast as > unsigned long*/ > + /* Sometimes we get a const g_something *, but need to pass it > internally > + * to other functions taking a non-const g_something *, which results > + * with gcc and -Wcast-qual in a compile time warning, and with -Werror > + * even to a compile time error. > + * Workarounds have been to e.g. memcpy(&list, _list); or similar, > + * the reason of which is non-obvious to the casual reader. > + * This macro achieves the same, and annotates why it is done. > + */ > +#define UNCONST_CAST_POINTER(t, p) ((t)(unsigned long)(p))
Cool! Didn't notice this before. Dejan > #define HAURL(url) HA_URLBASE url > > diff -r 5e309d182040 -r 066f484922ec lib/clplumbing/cl_msg.c > --- a/lib/clplumbing/cl_msg.c Tue Sep 28 13:06:35 2010 +0200 > +++ b/lib/clplumbing/cl_msg.c Tue Sep 28 13:12:33 2010 +0200 > @@ -951,7 +951,6 @@ > { > GList* list = NULL; > int ret; > - char buf[MAXMSG]; > > if(!msg || !name || !value){ > cl_log(LOG_ERR, "cl_msg_list_add_string: input invalid"); > @@ -959,8 +958,7 @@ > } > > > - strncpy(buf, value, MAXMSG); > - list = g_list_append(list, buf); > + list = g_list_append(list, UNCONST_CAST_POINTER(gpointer, value)); > if (!list){ > cl_log(LOG_ERR, "cl_msg_list_add_string: append element to" > "a glist failed"); > diff -r 5e309d182040 -r 066f484922ec lib/clplumbing/cl_msg_types.c > --- a/lib/clplumbing/cl_msg_types.c Tue Sep 28 13:06:35 2010 +0200 > +++ b/lib/clplumbing/cl_msg_types.c Tue Sep 28 13:12:33 2010 +0200 > @@ -168,12 +168,9 @@ > string_list_pack_length(const GList* _list) > { > size_t i; > - GList* list = NULL; > + GList* list = UNCONST_CAST_POINTER(GList *, _list); > size_t total_length = 0; > > - memcpy(&list, &_list, sizeof(GList*)); > - (void)list; > - > if (list == NULL){ > cl_log(LOG_WARNING, "string_list_pack_length():" > "list is NULL"); > @@ -438,16 +435,14 @@ > { > size_t i; > GList* newlist = NULL; > - GList* list; > - > - memcpy(&list, &_list, sizeof(GList*)); > + GList* list = UNCONST_CAST_POINTER(GList *, _list); > > for (i = 0; i < g_list_length(list); i++){ > char* dup_element = NULL; > char* element = g_list_nth_data(list, i); > int len; > if (element == NULL){ > - cl_log(LOG_WARNING, "list_cleanup:" > + cl_log(LOG_WARNING, "list_copy:" > "element is NULL"); > continue; > } > _______________________________________________________ > Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org > http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev > Home Page: http://linux-ha.org/ _______________________________________________________ Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/