Re: embedded list v3

From: Andres Freund <andres(at)2ndquadrant(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Cc: Peter Geoghegan <peter(at)2ndquadrant(dot)com>, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Tom Lane <tgl(at)postgresql(dot)org>
Subject: Re: embedded list v3
Date: 2012-10-08 20:03:52
Message-ID: 201210082203.52764.andres@2ndquadrant.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi Peter,

On Monday, October 08, 2012 09:43:51 PM Peter Geoghegan wrote:
> Pendantry: This should be in alphabetical order:
>
> ! OBJS = stringinfo.o ilist.o
Argh. Youve said that before. Somehow I reintroduced it...

> I notice that the patch (my revision) produces a whole bunch of
> warnings like this with Clang, though not GCC:
>
> """"""""
>
> [peter(at)peterlaptop cache]$ clang -O2 -g -Wall -Wmissing-prototypes
> -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels
> -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
> -fwrapv -fexcess-precision=standard -g -I../../../../src/include
> -D_GNU_SOURCE -D_FORTIFY_SOURCE=2 -I/usr/include/libxml2 -c -o
> catcache.o catcache.c -MMD -MP -MF .deps/catcache.Po
> clang: warning: argument unused during compilation:
> '-fexcess-precision=standard'
> catcache.c:457:21: warning: expression result unused [-Wunused-value]
> CatCache *ccp = slist_container(CatCache, cc_next,
> cache_iter.cur);
>
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ../../../../src/include/lib/ilist.h:721:3: note: expanded from macro
> 'slist_container'
> (AssertVariableIsOfTypeMacro(ptr, slist_node *),...
> ^
> ../../../../src/include/c.h:735:2: note: expanded from macro
> 'AssertVariableIsOfTypeMacro'
> StaticAssertExpr(__builtin_types_compatible_p(__typeof__(varname),
> typename), \
> ^
> ../../../../src/include/c.h:710:46: note: expanded from macro
> 'StaticAssertExpr' ({ StaticAssertStmt(condition, errmessage); true; })
> ^
> ../../../../src/include/c.h:185:15: note: expanded from macro 'true'
> #define true ((bool) 1)
> ^ ~
>
> *** SNIP SNIP SNIP ***
>
> catcache.c:1818:21: warning: expression result unused [-Wunused-value]
> CatCache *ccp = slist_container(CatCache, cc_next,
> iter.cur); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ../../../../src/include/lib/ilist.h:722:3: note: expanded from macro
> 'slist_container'
> AssertVariableIsOfTypeMacro(((type*)NULL)->membername,
> slist_node), \
> ^
> ../../../../src/include/c.h:735:2: note: expanded from macro
> 'AssertVariableIsOfTypeMacro'
> StaticAssertExpr(__builtin_types_compatible_p(__typeof__(varname),
> typename), \
> ^
> ../../../../src/include/c.h:710:46: note: expanded from macro
> 'StaticAssertExpr' ({ StaticAssertStmt(condition, errmessage); true; })
> ^
> ../../../../src/include/c.h:185:15: note: expanded from macro 'true'
> #define true ((bool) 1)
> ^ ~
> 28 warnings generated.
>
> """"""""
>
> I suppose that this is something that's going to have to be addressed
> sooner or later.
That looks like an annoying warning. Split of StaticAssertExpr into
StaticAssertExpr and StaticAssertExprBool?

> This seems kind of arbitrary:
>
> /* The socket number we are listening for connections on */
> int PostPortNumber;
> +
> /* The directory names for Unix socket(s) */
> char *Unix_socket_directories;
> +
> /* The TCP listen address(es) */
> char *ListenAddresses;
Yep, no idea why I added the spaces.

> This looks funny:
>
> + #endif /* defined(USE_INLINE) ||
> + * defined(ILIST_DEFINE_FUNCTIONS) */
>
> I tend to consider the 80-column thing a recommendation more than a
> requirement.
Thats pgindent's doing. I couldn't convince it not to do that short of making
it a multiline comment with ----'s.

> A further stylistic gripe is that this:
>
> + #define dlist_container(type, membername, ptr)
\
> + (AssertVariableIsOfTypeMacro(ptr, dlist_node *), \
> + AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node),
> \ + ((type *)((char *)(ptr) - offsetof(type, membername)))
\
> + )
>
> Should probably look like this:
>
> + #define dlist_container(type, membername, ptr)
\
> + (AssertVariableIsOfTypeMacro(ptr, dlist_node *), \
> + AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node),
> \ + ((type *)((char *)(ptr) - offsetof(type, membername))))
Why? I find the former better readable.

> This is a little unclear:
>
> + * dlist_foreach (iter, &db->tables)
> + * {
> + * // inside an *_foreach the iterator's .cur field can be used to
> access + * // the current element

> This comment:
>
> + * Singly linked lists are *not* circularly linked (how could they be?)
> in + * contrast to the doubly linked lists. As no pointer to the last
> list element
>
> Isn't quite accurate, if I've understood you correctly; it is surely
> possible in principle to have a circular singly-linked list.
Its complete crap. One shouldn't write comments after a 2h delayed 6h train
ride. No idea what exactly warped my mind there.

> This could be a little clearer; its "content"?:
>
> + * This is used to convert a dlist_node* returned by some list
> + * navigation/manipulation back to its content.
Youre right.'containing element'? 'containing struct'?

> I don't think you should refer to --enable-cassert here; it is
> better-principled to refer to USE_ASSERT_CHECKING:
Fine with me.

> That's all for now.
Thanks.

Greetings,

Andres
--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2012-10-08 20:33:29 Re: getopt() and strdup()
Previous Message Tom Lane 2012-10-08 20:00:27 Re: Add FET to Default and Europe.txt