tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pserialize(9) vs. TAILQ



   Date: Wed, 19 Nov 2014 16:28:41 +0800
   From: Dennis Ferguson <dennis.c.ferguson%gmail.com@localhost>

   On 19 Nov, 2014, at 01:54 , Taylor R Campbell <campbell+netbsd-tech-kern%mumble.net@localhost> wrote:

   > What type pun is that?  I don't see it.

   I think this one:

   #define TAILQ_LAST(head, headname) \
           (*(((struct headname *)((head)->tqh_last))->tqh_last))
   #define TAILQ_PREV(elm, headname, field) \
           (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))

Pooh.  Fortunately, it applies only to reverse iteration, which most
tailq users don't rely on.

Perhaps it's time to invent a new API where you have to declare the
queue type up front -- both TAILQ and CIRCLEQ use the same physical
structure for the head and entry, so if we had a struct tag declared
up front they could both use that.  Something like:

BIDIQ_TYPE(frobq, frob);
/*
 * struct frob;
 * struct frobq { struct frob *bqh_first; struct frob **bqh_last; };
 */

BIDIQ_HEAD(frobq, frob_head);
/* struct frob_head { struct frobq q; }; */

struct frob_head the_frobs = BIDIQ_HEAD_INITIALIZER(&the_frobs);

struct frob {
	...
	BIDIQ_ENTRY(frobq)	f_entry;
	/* struct frobq		f_entry; */
	...
};


Home | Main Index | Thread Index | Old Index