svn commit: r292809 - head/lib/libc/stdio
John Baldwin
jhb at freebsd.org
Mon Dec 28 19:42:41 UTC 2015
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