Re: embedded list v3 - Mailing list pgsql-hackers

From Peter Geoghegan
Subject Re: embedded list v3
Date
Msg-id CAEYLb_X=RUE0z0ZuYH8AE7+jx=ZXSDULEdyuFZHPpct0FxcxDw@mail.gmail.com
Whole thread Raw
In response to Re: embedded list v3  (Andres Freund <andres@2ndquadrant.com>)
Responses Re: embedded list v3
List pgsql-hackers
On 29 September 2012 01:14, Andres Freund <andres@2ndquadrant.com> wrote:
> Current version is available at branch ilist in:
> git://git.postgresql.org/git/users/andresfreund/postgres.git
> ssh://git@git.postgresql.org/users/andresfreund/postgres.git

I have taken a look at the ilist branch, merged into today's master.
This patch includes changes to core, so that certain call sites now
call this new doubly-linked list infrastructure rather than
infrastructure located in dllist.c, which the patch deprecates, per
Andres' proprosal. As a convenience to others, I attach a patch file
of same. I have taken the liberty of altering it so that it now uses
the static assert infrastructure that Tom split off, altered somewhat,
and committed about a week ago, with commits
ea473fb2dee7dfe61f8fbdfac9d9da87d84e564e and
0d0aa5d29175c539db1981be27dbbf059be6f3b1. I haven't altered anything
beyond what is needed to make the patch build against head, including
changes already suggested by Tom; this is still entirely Andres'
patch.

Pendantry: This should be in alphabetical order:

! OBJS = stringinfo.o ilist.o

I notice that the patch (my revision) produces a whole bunch of
warnings like this with Clang, though not GCC:

""""""""

[peter@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.

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;

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.

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))))

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.

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.

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

+ /*
+  * enable for extra debugging. This is rather expensive, so it's not
enabled by
+  * default even with --enable-cassert.
+  */
+ /* #define ILIST_DEBUG */

As to the substantial issues, I have no strong opinion either way as
to whether or not the doubly-linked list should be circular. It might
be nice to see some numbers, if that's what is informing Andres'
thinking here.

The code appears to be reasonable to me. The example is generally illustrative.

That's all for now.

--
Peter Geoghegan       http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training and Services

Attachment

pgsql-hackers by date:

Previous
From: Christopher Browne
Date:
Subject: Re: Add FET to Default and Europe.txt
Next
From: Kohei KaiGai
Date:
Subject: Re: [v9.3] Row-Level Security