This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/3] nptl: Add tests for internal pthread_mutex_t offsets


On Thu, Oct 19, 2017 at 2:00 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> This patch adds a new build test to check for internal fields
> offsets uses on pthread_mutex_t static initialization macros
> (PTHREAD_MUTEX_INITIALIZER, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP,
> PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, and
> PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP).
>
> Currently the only field which is statically initialized to a
> non zero value is pthread_mutex_t.__data.__kind value, however
> the test also check the offset of __kind, __spins, __elision (if
> support), and __list internal member.  A internal header
> (pthread-offset.h) is added to each major ABI with the reference
> value.
>
> Checked on x86_64-linux-gnu and with a build check for all affected
> ABIs (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabihf,
> hppa-linux-gnu, i686-linux-gnu, ia64-linux-gnu, m68k-linux-gnu,
> microblaze-linux-gnu, mips64-linux-gnu, mips64-n32-linux-gnu,
> mips-linux-gnu, powerpc64le-linux-gnu, powerpc-linux-gnu,
> s390-linux-gnu, s390x-linux-gnu, sh4-linux-gnu, sparc64-linux-gnu,
> sparcv9-linux-gnu, tilegx-linux-gnu, tilegx-linux-gnu-x32,
> tilepro-linux-gnu, x86_64-linux-gnu, and x86_64-linux-x32).
>
>         * nptl/Makefile (tests-internal): Add tst-offsets.
>         * nptl/tst-offsets.c: New file.
>         * sysdeps/aarch64/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/alpha/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/arm/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/hppa/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/i386/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/ia64/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/m68k/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/microblaze/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/mips/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/nios2/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/powerpc/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/s390/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/sh/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/sparc/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/tile/nptl/pthread-offsets.h: Likewise.
>         * sysdeps/x86_64/nptl/pthread-offsets.h: Likewise.
> ---
>  ChangeLog                                 | 21 ++++++++++++
>  nptl/Makefile                             |  2 +-
>  nptl/tst-offsets.c                        | 54 +++++++++++++++++++++++++++++++
>  sysdeps/aarch64/nptl/pthread-offsets.h    |  5 +++
>  sysdeps/alpha/nptl/pthread-offsets.h      |  5 +++
>  sysdeps/arm/nptl/pthread-offsets.h        |  5 +++
>  sysdeps/hppa/nptl/pthread-offsets.h       |  5 +++
>  sysdeps/i386/nptl/pthread-offsets.h       |  5 +++
>  sysdeps/ia64/nptl/pthread-offsets.h       |  5 +++
>  sysdeps/m68k/nptl/pthread-offsets.h       |  5 +++
>  sysdeps/microblaze/nptl/pthread-offsets.h |  5 +++
>  sysdeps/mips/nptl/pthread-offsets.h       | 13 ++++++++
>  sysdeps/nios2/nptl/pthread-offsets.h      |  5 +++
>  sysdeps/powerpc/nptl/pthread-offsets.h    | 15 +++++++++
>  sysdeps/s390/nptl/pthread-offsets.h       | 15 +++++++++
>  sysdeps/sh/nptl/pthread-offsets.h         |  5 +++
>  sysdeps/sparc/nptl/pthread-offsets.h      | 15 +++++++++
>  sysdeps/tile/nptl/pthread-offsets.h       | 15 +++++++++
>  sysdeps/x86_64/nptl/pthread-offsets.h     |  5 +++
>  19 files changed, 204 insertions(+), 1 deletion(-)
>  create mode 100644 nptl/tst-offsets.c
>  create mode 100644 sysdeps/aarch64/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/alpha/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/arm/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/hppa/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/i386/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/ia64/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/m68k/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/microblaze/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/mips/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/nios2/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/powerpc/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/s390/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/sh/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/sparc/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/tile/nptl/pthread-offsets.h
>  create mode 100644 sysdeps/x86_64/nptl/pthread-offsets.h
>
> diff --git a/nptl/Makefile b/nptl/Makefile
> index d819349..7492b06 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -304,7 +304,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
>         tst-thread_local1 tst-mutex-errorcheck tst-robust10 \
>         tst-robust-fork tst-create-detached tst-memstream
>
> -tests-internal := tst-typesizes \
> +tests-internal := tst-typesizes tst-offsets \
>                   tst-rwlock19 tst-rwlock20 \
>                   tst-sem11 tst-sem12 tst-sem13 \
>                   tst-barrier5 tst-signal7 tst-mutex8 tst-mutex8-static \
> diff --git a/nptl/tst-offsets.c b/nptl/tst-offsets.c
> new file mode 100644
> index 0000000..0df1155
> --- /dev/null
> +++ b/nptl/tst-offsets.c
> @@ -0,0 +1,54 @@
> +/* Check pthread internal offsets.
> +   Copyright (C) 2017 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdio.h>
> +#include <pthreadP.h>
> +#include <semaphore.h>
> +
> +#include <pthread-offsets.h>
> +
> +#define STR_HELPER(x) #x
> +#define STR(x) STR_HELPER(x)
> +
> +static int
> +do_test (void)
> +{
> +#define TEST_OFFSET(type, member, offset) \
> +  _Static_assert (offsetof (type, member) == offset, \
> +                 "offset of " #member " field of " #type " != " \
> +                 STR (offset))
> +
> +  /* Check if internal fields in pthread_mutex_t used by static initializers
> +     have the expected offset.  */
> +  TEST_OFFSET (pthread_mutex_t, __data.__nusers,
> +              __PTHREAD_MUTEX_NUSERS_OFFSET);
> +  TEST_OFFSET (pthread_mutex_t, __data.__kind,
> +              __PTHREAD_MUTEX_KIND_OFFSET);
> +  TEST_OFFSET (pthread_mutex_t, __data.__spins,
> +              __PTHREAD_MUTEX_SPINS_OFFSET);
> +#if __PTHREAD_MUTEX_LOCK_ELISION
> +  TEST_OFFSET (pthread_mutex_t, __data.__elision,
> +              __PTHREAD_MUTEX_ELISION_OFFSET);
> +#endif
> +  TEST_OFFSET (pthread_mutex_t, __data.__list,
> +              __PTHREAD_MUTEX_LIST_OFFSET);
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/aarch64/nptl/pthread-offsets.h b/sysdeps/aarch64/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..16c6b0d
> --- /dev/null
> +++ b/sysdeps/aarch64/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +#define __PTHREAD_MUTEX_KIND_OFFSET     16
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     24
> diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..16c6b0d
> --- /dev/null
> +++ b/sysdeps/alpha/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +#define __PTHREAD_MUTEX_KIND_OFFSET     16
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     24
> diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..9617354
> --- /dev/null
> +++ b/sysdeps/arm/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     20
> diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..8ae01b9
> --- /dev/null
> +++ b/sysdeps/hppa/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   32
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    36
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     36
> diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..9617354
> --- /dev/null
> +++ b/sysdeps/i386/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     20
> diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..16c6b0d
> --- /dev/null
> +++ b/sysdeps/ia64/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +#define __PTHREAD_MUTEX_KIND_OFFSET     16
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     24
> diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..9617354
> --- /dev/null
> +++ b/sysdeps/m68k/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     20
> diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..9617354
> --- /dev/null
> +++ b/sysdeps/microblaze/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     20
> diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..0ac3eda
> --- /dev/null
> +++ b/sysdeps/mips/nptl/pthread-offsets.h
> @@ -0,0 +1,13 @@
> +#if _MIPS_SIM == _ABI64
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +# define __PTHREAD_MUTEX_KIND_OFFSET     16
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     24
> +#else
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +# define __PTHREAD_MUTEX_KIND_OFFSET     12
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     20
> +#endif
> diff --git a/sysdeps/nios2/nptl/pthread-offsets.h b/sysdeps/nios2/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..9617354
> --- /dev/null
> +++ b/sysdeps/nios2/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     20
> diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..bdda1f1
> --- /dev/null
> +++ b/sysdeps/powerpc/nptl/pthread-offsets.h
> @@ -0,0 +1,15 @@
> +#include <bits/wordsize.h>
> +
> +#if __WORDSIZE == 64
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +# define __PTHREAD_MUTEX_KIND_OFFSET     16
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     24
> +#else
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +# define __PTHREAD_MUTEX_KIND_OFFSET     12
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     20
> +#endif
> diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..bdda1f1
> --- /dev/null
> +++ b/sysdeps/s390/nptl/pthread-offsets.h
> @@ -0,0 +1,15 @@
> +#include <bits/wordsize.h>
> +
> +#if __WORDSIZE == 64
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +# define __PTHREAD_MUTEX_KIND_OFFSET     16
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     24
> +#else
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +# define __PTHREAD_MUTEX_KIND_OFFSET     12
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     20
> +#endif
> diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..9617354
> --- /dev/null
> +++ b/sysdeps/sh/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +#define __PTHREAD_MUTEX_KIND_OFFSET     12
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     20
> diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..bdda1f1
> --- /dev/null
> +++ b/sysdeps/sparc/nptl/pthread-offsets.h
> @@ -0,0 +1,15 @@
> +#include <bits/wordsize.h>
> +
> +#if __WORDSIZE == 64
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +# define __PTHREAD_MUTEX_KIND_OFFSET     16
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     24
> +#else
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +# define __PTHREAD_MUTEX_KIND_OFFSET     12
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     20
> +#endif
> diff --git a/sysdeps/tile/nptl/pthread-offsets.h b/sysdeps/tile/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..bdda1f1
> --- /dev/null
> +++ b/sysdeps/tile/nptl/pthread-offsets.h
> @@ -0,0 +1,15 @@
> +#include <bits/wordsize.h>
> +
> +#if __WORDSIZE == 64
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +# define __PTHREAD_MUTEX_KIND_OFFSET     16
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     24
> +#else
> +# define __PTHREAD_MUTEX_NUSERS_OFFSET   16
> +# define __PTHREAD_MUTEX_KIND_OFFSET     12
> +# define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +# define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +# define __PTHREAD_MUTEX_LIST_OFFSET     20
> +#endif
> diff --git a/sysdeps/x86_64/nptl/pthread-offsets.h b/sysdeps/x86_64/nptl/pthread-offsets.h
> new file mode 100644
> index 0000000..16c6b0d
> --- /dev/null
> +++ b/sysdeps/x86_64/nptl/pthread-offsets.h
> @@ -0,0 +1,5 @@
> +#define __PTHREAD_MUTEX_NUSERS_OFFSET   12
> +#define __PTHREAD_MUTEX_KIND_OFFSET     16
> +#define __PTHREAD_MUTEX_SPINS_OFFSET    20
> +#define __PTHREAD_MUTEX_ELISION_OFFSET  22
> +#define __PTHREAD_MUTEX_LIST_OFFSET     24
> --

These are wrong for x32.  You need to add

#if __WORDSIZE == 64
...


-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]