svn commit: r292809 - head/lib/libc/stdio
Warner Losh
imp at bsdimp.com
Mon Dec 28 20:01:28 UTC 2015
I'll look at that, but I don't think posix_memalign is the right way to go.
The alignment of FILE is more strict than posix_memalign will return. Ian's
idea of __alignof__ is the way to go. We allocate them in one block on
purpose for performance, and posix_memalign would be a one at a time affair.
Warner
On Dec 28, 2015 12:42 PM, "John Baldwin" <jhb at freebsd.org> wrote:
> On Sunday, December 27, 2015 11:04:12 PM Warner Losh wrote:
> > Author: imp
> > Date: Sun Dec 27 23:04:11 2015
> > New Revision: 292809
> > URL: https://svnweb.freebsd.org/changeset/base/292809
> >
> > Log:
> > The FILE structure has a mbstate_t in it. This structure needs to be
> > aligned on a int64_t boundary. However, when we allocate the array of
> > these structures, we use ALIGNBYTES which defaults to sizeof(int) on
> > arm, i386 and others. The i386 stuff can handle unaligned accesses
> > seemlessly. However, arm cannot. Take this into account when creating
> > the array of FILEs, and add some comments about why.
> >
> > Differential Revision: https://reviews.freebsd.org/D4708
> >
> > Modified:
> > head/lib/libc/stdio/findfp.c
> >
> > Modified: head/lib/libc/stdio/findfp.c
> >
> ==============================================================================
> > --- head/lib/libc/stdio/findfp.c Sun Dec 27 23:04:10 2015
> (r292808)
> > +++ head/lib/libc/stdio/findfp.c Sun Dec 27 23:04:11 2015
> (r292809)
> > @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
> > #include <unistd.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > +#include <stdint.h>
> > #include <string.h>
> >
> > #include <spinlock.h>
> > @@ -96,11 +97,22 @@ moreglue(int n)
> > struct glue *g;
> > static FILE empty = { ._fl_mutex = PTHREAD_MUTEX_INITIALIZER };
> > FILE *p;
> > + size_t align;
> >
> > - g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n *
> sizeof(FILE));
> > + /*
> > + * FILE has a mbstate_t variable. This variable tries to be int64_t
> > + * aligned through its definition. int64_t may be larger than void
> *,
> > + * which is the size traditionally used for ALIGNBYTES. So, use
> our own
> > + * rounding instead of the MI ALIGN macros. If for some reason
> > + * ALIGNBYTES is larger than int64_t, respect that too. There
> appears to
> > + * be no portable way to ask for FILE's alignment requirements
> other
> > + * than just knowing here.
> > + */
> > + align = MAX(ALIGNBYTES, sizeof(int64_t));
> > + g = (struct glue *)malloc(sizeof(*g) + align + n * sizeof(FILE));
> > if (g == NULL)
> > return (NULL);
> > - p = (FILE *)ALIGN(g + 1);
> > + p = (FILE *)roundup((uintptr_t)(g + 1), align);
>
> Can this use posix_memalign() rather than doing the alignment by hand?
>
> --
> John Baldwin
>
More information about the svn-src-head
mailing list