linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Zach Brown <zab@zabbo.net>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH][2.5] Single linked lists for Linux, overly complicated v2
Date: Fri, 27 Sep 2002 16:39:22 -0400	[thread overview]
Message-ID: <20020927163922.A13817@bitchcake.off.net> (raw)
In-Reply-To: <Pine.LNX.4.44.0209271359250.7827-100000@hawkeye.luckynet.adm>; from thunder@lightweight.ods.org on Fri, Sep 27, 2002 at 02:08:17PM -0600

> > #define TSLIST_MEMBER_INIT(member) 		\
> > 	NULL
> 
> I'd prefer { .next = NULL; }

that only works if you have a proper struct for the list members, not
magical pointers that are embedded in their definition.  (also, its
pretty unacceptable that if I have a singly linked list of buffer_heads
that I need to have an entire dummy buffer_head struct allocated to be
the head.  this incongruity is what creates the special casing of the
head as a type *point on its own, while the list members are type *
pointer members in type structs).  

the explicit struct is much cleaner (as wli's post shows) and the member
approach allows hand-wavey macrosy type safety while only allowing a
particular struct to be on one list.

> I'd still prefer calling the field ->next.

arguments could be made about layering violations: that the member
name should really scream out that its going to be magically used by
macros deep in include/ somewhere.

> > #define tslist_on_list(_head,_elem) 		\
> > 	( (_elem)->_slist_next != NULL || _head == _elem )
> 
> That doesn't give me whether the elem is on _that_ list.

no, it doesn't.  it isn't meant to.

> That's adding to front. One should be aware of that. The other add is
> 
> #define slist_add(_new_in, _head_in)            \
> do {                                            \
>         typeof(_head_in) _head = (_head_in),    \
>                     _new = (_new_in);           \
>         _new->next = _head->next;               \
>         _head->next = _new;                     \
> } while (0)

which is a degenerate case of slist_add_pos(), which is more
complication than this trivial implementation needs.  have you looked at other
single linked list implementations?  like glib's?  do you really think
we need that in the kernel?

> > #define __tslist_walk_del(_start, _elem)			\
> > 	do {							\
> > 		typeof(_start) _pos, _prev = _start;		\
> > 		for (; _prev && (_pos = _prev->_slist_next) ;	\
> > 			_prev = _pos ) {			\
> > 			if ( _pos != _elem )			\
> > 				continue;			\
> > 			_prev->_slist_next = (_elem)->_slist_next;\
> > 			(_elem)->_slist_next = NULL;		\
> > 			break;					\
> > 		}						\
> > 	} while (0)
> 
> This looks overly complicated. Why not something like while, but this 
> weird for construct?

	while (A) {
		...
		B;
	}

	for ( ; A ; B ) {
	}

some people prefer to have the loop terminating invariant explicitly
expressed in the for() construct so that it isn't overlooked.  perhaps you
don't.

> That lacks the prefetch feature at all.
> 
> The issue overall is that you still evaluate the arguments more than once. 
> That's what Nikita mentioned: you might end up somewhere outlandish.

yes, both of these are mechanical refinements that don't change the API
at all.  they can wait until people have actually expressed interest in
this thing being in the kernel.  has anyone expressed real interest?

but really, as I realized the single membership limitation of this api,
it became clear to me that its too limited.  if you want to persue this,
move to the very simple struct list proposal that wli did.    

- z

  reply	other threads:[~2002-09-27 20:34 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20020926142547.N13817@bitchcake.off.net>
2002-09-26 18:45 ` [PATCH][2.5] Single linked lists for Linux, overly complicated v2 Thunder from the hill
2002-09-26 19:29   ` Rik van Riel
2002-09-26 19:43     ` Thunder from the hill
2002-09-26 20:00       ` Rik van Riel
2002-09-26 20:10         ` Thunder from the hill
2002-09-26 21:13         ` Thunder from the hill
2002-09-26 21:19           ` Thunder from the hill
2002-09-27  0:57       ` Zach Brown
2002-09-27 20:08         ` Thunder from the hill
2002-09-27 20:39           ` Zach Brown [this message]
2002-09-27 20:52             ` Thunder from the hill
2002-09-28  9:45         ` Thunder from the hill
2002-09-30 19:37         ` Daniel Phillips
2002-09-30 20:04           ` Zach Brown
     [not found]             ` <E17w7N8-0005px-00@starship>
2002-09-30 20:50               ` Zach Brown
2002-10-01 16:05             ` Daniel Phillips
2002-09-26 19:49     ` David B. Stevens
     [not found] <924963807@toto.iv>
2002-09-27  3:56 ` Peter Chubb
2002-09-27  7:27   ` Arnaldo Carvalho de Melo
2002-09-27 14:56   ` Thunder from the hill
2002-09-30 19:48   ` Daniel Phillips
2002-09-26 17:41 Lightweight Patch Manager
2002-09-26 17:53 ` Rik van Riel
2002-09-26 18:26   ` Thunder from the hill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20020927163922.A13817@bitchcake.off.net \
    --to=zab@zabbo.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).