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/

Reply via email to