Date: Thu, 5 Oct 2000 22:03:47 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: Jeffrey Hsu <hsu@FreeBSD.ORG> Cc: current@FreeBSD.ORG Subject: Re: #include <struct.h> in <sys/queue.h> Message-ID: <Pine.BSF.4.21.0010052142030.442-100000@besplex.bde.org> In-Reply-To: <20001003080816.9D03137B502@hub.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 3 Oct 2000, Jeffrey Hsu wrote: > > I think <struct.h> should have been removed when offsetof() became > > standard. > > At last count, offsetof() is defined in 11 different places in the kernel: > alpha/alpha/machdep.c, line 234 >... Some other places include <stddef.h>. > If we unify it in one header file, I'd be happy to use that for STAILQ_LAST(). <machine/ansi.h> is a good place for it now. > > strbase() is now used in <sys/queue.h>. It is > > easy to implement directly using offsetof(). Unfortunately, if it is > > implemented using offsetof(), then <sys/queue.h> will depend on > > <stddef.h>. > > So, what's the correct solution? I'm currently using the following. This avoids a bug in fldoff(): casting to int is wrong and causes warnings on alphas. I use a cast to __uintptr_t since casting to size_t is normally right (offsetof() depends on it), and __uintptr_t is normally equivalent to size_t and is easier to get at. --- diff -c2 queue.h~ queue.h *** queue.h~ Fri Aug 4 21:38:55 2000 --- queue.h Thu Oct 5 21:22:51 2000 *************** *** 38,43 **** #define _SYS_QUEUE_H_ - #include <struct.h> - /* * This file defines five types of data structures: singly-linked lists, --- 38,41 ---- *************** *** 224,231 **** } while (0) #define STAILQ_LAST(head, type, field) \ ! (STAILQ_EMPTY(head) ? \ ! NULL : \ ! strbase(type, (head)->stqh_last, field)) #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) --- 222,239 ---- } while (0) + /* + * XXX auxiliary macros for STAILQ_LAST() adapted from offsetof() in + * <stddef.h> and strbase() in <struct.h>. + */ + #include <machine/ansi.h> + + #define __offsetof(type, member) \ + ((__uintptr_t)(&((type *)0)->member)) + #define __strbase(name, addr, field) \ + ((struct name *)((char *)(addr) - __offsetof(struct name, field))) + #define STAILQ_LAST(head, type, field) \ ! (STAILQ_EMPTY(head) ? NULL : \ ! __strbase(type, (head)->stqh_last, field)) #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) --- Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0010052142030.442-100000>