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