svn commit: r332072 - head/sys/sys

Warner Losh imp at bsdimp.com
Thu Apr 5 15:58:38 UTC 2018


On Thu, Apr 5, 2018 at 9:46 AM, Roger Pau Monné <royger at freebsd.org> wrote:

> On Thu, Apr 05, 2018 at 09:32:57AM -0600, Ian Lepore wrote:
> > On Thu, 2018-04-05 at 14:31 +0000, Roger Pau Monné wrote:
> > > Author: royger
> > > Date: Thu Apr  5 14:31:54 2018
> > > New Revision: 332072
> > > URL: https://svnweb.freebsd.org/changeset/base/332072
> > >
> > > Log:
> > >   introduce GiB and MiB macros
> > >
> > >   This macros convert from GiB or MiB into bytes.
> > >
> > >   Sponsored by: Citrix Systems R&D
> > >
> > > Modified:
> > >   head/sys/sys/param.h
> > >
> > > Modified: head/sys/sys/param.h
> > > ============================================================
> ==================
> > > --- head/sys/sys/param.h    Thu Apr  5 14:25:39 2018        (r332071)
> > > +++ head/sys/sys/param.h    Thu Apr  5 14:31:54 2018        (r332072)
> > > @@ -362,4 +362,8 @@ __END_DECLS
> > >   */
> > >  #define __PAST_END(array, offset) (((__typeof__(*(array))
> *)(array))[offset])
> > >
> > > +/* Unit conversion macros. */
> > > +#define GiB(v) (v ## ULL << 30)
> > > +#define MiB(v) (v ## ULL << 20)
> > > +
> > >  #endif     /* _SYS_PARAM_H_ */
> > >
> >
> > These names don't make it clear whether the conversion is bytes->GiB or
> > GiB->bytes.  The names seem way too generic for a public namespace in a
> > file as heavily included behind your back as param.h is.
> >
> > Also, this completely reasonable usage won't work, likely with
> > confusing compile error messages:
> >
> >   int bytes, gibytes;
> >   ...
> >   bytes = GiB(gibytes);
>
> I find those helpful for their specific usage. I could introduce
> static inline functions like:
>
> size_t gb_to_bytes(size_t)...
>
> But I assume this is also going to cause further discussion.
>

Yea, traditional macro names would be "gibtob" and "btogib" but I didn't
just reply to bikeshed a name:

But you don't need to specify a type, consider the current btodb macro:
#define btodb(bytes)                    /* calculates (bytes / DEV_BSIZE)
*/ \
        (sizeof (bytes) > sizeof(long) \
         ? (daddr_t)((unsigned long long)(bytes) >> DEV_BSHIFT) \
         : (daddr_t)((unsigned long)(bytes) >> DEV_BSHIFT))

which shows how to do this in a macro, which is orthogonal to any name you
may choose. I can also bikeshed function vs macro :)

Warner


More information about the svn-src-head mailing list