mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
nptl: Change tst-typesizes to _Static_assert
Instead of rely on runtime check to assure correct pthread types size a better strategy would use _Static_assert to trigger an error on build time (and thus allowing to check to potentially ABI breakage on cross-compiling make check). This patch moves nptl/tst-typesizes.c to libpthread build time on each specific initialization routine and also remove some runtime redundant asserts for the same type sizes. 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/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE): New macros. * nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time checks for expected input type size. * nptl/pthread_barrier_init.c (__pthread_barrier_init): Likewise. * nptl/pthread_barrierattr_init.c (pthread_barrierattr_init): Likewise. * nptl/pthread_cond_init.c (__pthread_cond_init): Likewise. * nptl/pthread_condattr_init.c (__pthread_condattr_init): Likewise. * nptl/pthread_mutex_init.c (__pthread_mutex_init): Likewise. * nptl/pthread_mutexattr_init.c (__pthread_mutexattr_init): Likewise. * nptl/pthread_rwlock_init.c (__pthread_rwlock_init): Likewise. * nptl/pthread_rwlockattr_init.c (pthread_rwlockattr_init): Likewise. * nptl/sem_init.c (__new_sem_init, __old_sem_init): Likewise * nptl/pthread_attr_destroy.c (__pthread_attr_destroy): Remove superflous runtime assert check. * nptl/pthread_attr_getaffinity.c (__pthread_attr_getaffinity_new): Likewise. * nptl/pthread_attr_getdetachstate.c (__pthread_attr_getdetachstate): Likewise. * nptl/pthread_attr_getguardsize.c (pthread_attr_getguardsize): Likewise. * nptl/pthread_attr_getinheritsched.c (__pthread_attr_getinheritsched): Likewise. * nptl/pthread_attr_getschedparam.c (__pthread_attr_getschedparam): Likewise. * nptl/pthread_attr_getschedpolicy.c (__pthread_attr_getschedpolicy): Likewise. * nptl/pthread_attr_getscope.c (__pthread_attr_getscope): Likewise. * nptl/pthread_attr_getstack.c (__pthread_attr_getstack): Likewise. * nptl/pthread_attr_getstackaddr.c (__pthread_attr_getstackaddr): Likewise. * nptl/pthread_attr_getstacksize.c (__pthread_attr_getstacksize): Likewise. * nptl/pthread_attr_setaffinity.c (__pthread_attr_setaffinity_new): Likewise. * nptl/pthread_attr_setdetachstate.c (__pthread_attr_setdetachstate): Likewise. * nptl/pthread_attr_setguardsize.c (pthread_attr_setguardsize): Likewise. * nptl/pthread_attr_setinheritsched.c (__pthread_attr_setinheritsched): Likewise. * nptl/pthread_attr_setschedparam.c (__pthread_attr_setschedparam): Likewise. * nptl/pthread_attr_setschedpolicy.c (__pthread_attr_setschedpolicy): Likewise. * nptl/pthread_attr_setscope.c (__pthread_attr_setscope): Likewise. * nptl/pthread_attr_setstack.c (__pthread_attr_setstack, __old_pthread_attr_setstack): Likewise. * nptl/pthread_attr_setstackaddr.c (__pthread_attr_setstackaddr): Likewise. * nptl/pthread_attr_setstacksize.c (__pthread_attr_setstacksize): Likewise. * nptl/pthread_getattr_default_np.c (pthread_getattr_default_np): Likewise. * nptl/pthread_mutex_lock.c (__pthread_mutex_lock): Likewise. * nptl/pthread_setattr_default_np.c (pthread_setattr_default_np): Likewise. * nptl/tst-typesizes.c: Remove file. Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
60
ChangeLog
60
ChangeLog
@ -1,5 +1,65 @@
|
|||||||
2017-11-07 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
2017-11-07 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
|
||||||
|
* nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE):
|
||||||
|
New macros.
|
||||||
|
* nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time
|
||||||
|
checks for expected input type size.
|
||||||
|
* nptl/pthread_barrier_init.c (__pthread_barrier_init): Likewise.
|
||||||
|
* nptl/pthread_barrierattr_init.c (pthread_barrierattr_init):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_cond_init.c (__pthread_cond_init): Likewise.
|
||||||
|
* nptl/pthread_condattr_init.c (__pthread_condattr_init): Likewise.
|
||||||
|
* nptl/pthread_mutex_init.c (__pthread_mutex_init): Likewise.
|
||||||
|
* nptl/pthread_mutexattr_init.c (__pthread_mutexattr_init): Likewise.
|
||||||
|
* nptl/pthread_rwlock_init.c (__pthread_rwlock_init): Likewise.
|
||||||
|
* nptl/pthread_rwlockattr_init.c (pthread_rwlockattr_init): Likewise.
|
||||||
|
* nptl/sem_init.c (__new_sem_init, __old_sem_init): Likewise
|
||||||
|
* nptl/pthread_attr_destroy.c (__pthread_attr_destroy): Remove
|
||||||
|
superflous runtime assert check.
|
||||||
|
* nptl/pthread_attr_getaffinity.c (__pthread_attr_getaffinity_new):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getdetachstate.c (__pthread_attr_getdetachstate):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getguardsize.c (pthread_attr_getguardsize):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getinheritsched.c (__pthread_attr_getinheritsched):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getschedparam.c (__pthread_attr_getschedparam):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getschedpolicy.c (__pthread_attr_getschedpolicy):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getscope.c (__pthread_attr_getscope): Likewise.
|
||||||
|
* nptl/pthread_attr_getstack.c (__pthread_attr_getstack): Likewise.
|
||||||
|
* nptl/pthread_attr_getstackaddr.c (__pthread_attr_getstackaddr):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_getstacksize.c (__pthread_attr_getstacksize):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setaffinity.c (__pthread_attr_setaffinity_new):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setdetachstate.c (__pthread_attr_setdetachstate):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setguardsize.c (pthread_attr_setguardsize):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setinheritsched.c
|
||||||
|
(__pthread_attr_setinheritsched): Likewise.
|
||||||
|
* nptl/pthread_attr_setschedparam.c (__pthread_attr_setschedparam):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setschedpolicy.c (__pthread_attr_setschedpolicy):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setscope.c (__pthread_attr_setscope): Likewise.
|
||||||
|
* nptl/pthread_attr_setstack.c (__pthread_attr_setstack,
|
||||||
|
__old_pthread_attr_setstack): Likewise.
|
||||||
|
* nptl/pthread_attr_setstackaddr.c (__pthread_attr_setstackaddr):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_attr_setstacksize.c (__pthread_attr_setstacksize):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_getattr_default_np.c (pthread_getattr_default_np):
|
||||||
|
Likewise.
|
||||||
|
* nptl/pthread_mutex_lock.c (__pthread_mutex_lock): Likewise.
|
||||||
|
* nptl/pthread_setattr_default_np.c (pthread_setattr_default_np):
|
||||||
|
Likewise.
|
||||||
|
* nptl/tst-typesizes.c: Remove file.
|
||||||
|
|
||||||
* nptl/pthreadP.h (ASSERT_PTHREAD_STRING,
|
* nptl/pthreadP.h (ASSERT_PTHREAD_STRING,
|
||||||
ASSERT_PTHREAD_INTERNAL_OFFSET): New macro.
|
ASSERT_PTHREAD_INTERNAL_OFFSET): New macro.
|
||||||
* nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time
|
* nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time
|
||||||
|
@ -639,6 +639,14 @@ check_stacksize_attr (size_t st)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ASSERT_TYPE_SIZE(type, size) \
|
||||||
|
_Static_assert (sizeof (type) == size, \
|
||||||
|
"sizeof (" #type ") != " #size)
|
||||||
|
|
||||||
|
#define ASSERT_PTHREAD_INTERNAL_SIZE(type, internal) \
|
||||||
|
_Static_assert (sizeof ((type) { 0 }).__size >= sizeof (internal), \
|
||||||
|
"sizeof (" #type ".__size) < sizeof (" #internal ")")
|
||||||
|
|
||||||
#define ASSERT_PTHREAD_STRING(x) __STRING (x)
|
#define ASSERT_PTHREAD_STRING(x) __STRING (x)
|
||||||
#define ASSERT_PTHREAD_INTERNAL_OFFSET(type, member, offset) \
|
#define ASSERT_PTHREAD_INTERNAL_OFFSET(type, member, offset) \
|
||||||
_Static_assert (offsetof (type, member) == offset, \
|
_Static_assert (offsetof (type, member) == offset, \
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -28,7 +27,6 @@ __pthread_attr_destroy (pthread_attr_t *attr)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
|
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -32,7 +31,6 @@ __pthread_attr_getaffinity_new (const pthread_attr_t *attr, size_t cpusetsize,
|
|||||||
{
|
{
|
||||||
const struct pthread_attr *iattr;
|
const struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (const struct pthread_attr *) attr;
|
iattr = (const struct pthread_attr *) attr;
|
||||||
|
|
||||||
if (iattr->cpuset != NULL)
|
if (iattr->cpuset != NULL)
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ __pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
*detachstate = (iattr->flags & ATTR_FLAG_DETACHSTATE
|
*detachstate = (iattr->flags & ATTR_FLAG_DETACHSTATE
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ pthread_attr_getguardsize (const pthread_attr_t *attr, size_t *guardsize)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
*guardsize = iattr->guardsize;
|
*guardsize = iattr->guardsize;
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ __pthread_attr_getinheritsched (const pthread_attr_t *attr, int *inherit)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Store the current values. */
|
/* Store the current values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -27,7 +26,6 @@ __pthread_attr_getschedparam (const pthread_attr_t *attr,
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Copy the current values. */
|
/* Copy the current values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ __pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Store the current values. */
|
/* Store the current values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ __pthread_attr_getscope (const pthread_attr_t *attr, int *scope)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Store the current values. */
|
/* Store the current values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ __pthread_attr_getstack (const pthread_attr_t *attr, void **stackaddr,
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Store the result. */
|
/* Store the result. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ __pthread_attr_getstackaddr (const pthread_attr_t *attr, void **stackaddr)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Some code assumes this function to work even if no stack address
|
/* Some code assumes this function to work even if no stack address
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ __pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
size_t size = iattr->stacksize;
|
size_t size = iattr->stacksize;
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -34,12 +33,14 @@ __pthread_attr_init_2_1 (pthread_attr_t *attr)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
|
ASSERT_TYPE_SIZE (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T);
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_attr_t, struct pthread_attr);
|
||||||
|
|
||||||
/* Many elements are initialized to zero so let us do it all at
|
/* Many elements are initialized to zero so let us do it all at
|
||||||
once. This also takes care of clearing the bytes which are not
|
once. This also takes care of clearing the bytes which are not
|
||||||
internally used. */
|
internally used. */
|
||||||
memset (attr, '\0', __SIZEOF_PTHREAD_ATTR_T);
|
memset (attr, '\0', __SIZEOF_PTHREAD_ATTR_T);
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Default guard size specified by the standard. */
|
/* Default guard size specified by the standard. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -31,7 +30,6 @@ __pthread_attr_setaffinity_new (pthread_attr_t *attr, size_t cpusetsize,
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
if (cpuset == NULL || cpusetsize == 0)
|
if (cpuset == NULL || cpusetsize == 0)
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ __pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid values. */
|
/* Catch invalid values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +24,6 @@ pthread_attr_setguardsize (pthread_attr_t *attr, size_t guardsize)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Note that we don't round the value here. The standard requires
|
/* Note that we don't round the value here. The standard requires
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ __pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid values. */
|
/* Catch invalid values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
@ -26,7 +25,6 @@ int
|
|||||||
__pthread_attr_setschedparam (pthread_attr_t *attr,
|
__pthread_attr_setschedparam (pthread_attr_t *attr,
|
||||||
const struct sched_param *param)
|
const struct sched_param *param)
|
||||||
{
|
{
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
struct pthread_attr *iattr = (struct pthread_attr *) attr;
|
struct pthread_attr *iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
int ret = check_sched_priority_attr (param->sched_priority,
|
int ret = check_sched_priority_attr (param->sched_priority,
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ __pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid values. */
|
/* Catch invalid values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ __pthread_attr_setscope (pthread_attr_t *attr, int scope)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid values. */
|
/* Catch invalid values. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
@ -33,7 +32,6 @@ __pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid sizes. */
|
/* Catch invalid sizes. */
|
||||||
@ -71,7 +69,6 @@ __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid sizes. */
|
/* Catch invalid sizes. */
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
|
||||||
@ -30,7 +29,6 @@ __pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr)
|
|||||||
EXTRA_PARAM_CHECKS;
|
EXTRA_PARAM_CHECKS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
iattr->stackaddr = stackaddr;
|
iattr->stackaddr = stackaddr;
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
@ -31,7 +30,6 @@ __pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid sizes. */
|
/* Catch invalid sizes. */
|
||||||
@ -58,7 +56,6 @@ __old_pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize)
|
|||||||
{
|
{
|
||||||
struct pthread_attr *iattr;
|
struct pthread_attr *iattr;
|
||||||
|
|
||||||
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
||||||
iattr = (struct pthread_attr *) attr;
|
iattr = (struct pthread_attr *) attr;
|
||||||
|
|
||||||
/* Catch invalid sizes. */
|
/* Catch invalid sizes. */
|
||||||
|
@ -32,6 +32,10 @@ int
|
|||||||
__pthread_barrier_init (pthread_barrier_t *barrier,
|
__pthread_barrier_init (pthread_barrier_t *barrier,
|
||||||
const pthread_barrierattr_t *attr, unsigned int count)
|
const pthread_barrierattr_t *attr, unsigned int count)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T);
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_barrier_t,
|
||||||
|
struct pthread_barrier);
|
||||||
|
|
||||||
struct pthread_barrier *ibarrier;
|
struct pthread_barrier *ibarrier;
|
||||||
|
|
||||||
/* XXX EINVAL is not specified by POSIX as a possible error code for COUNT
|
/* XXX EINVAL is not specified by POSIX as a possible error code for COUNT
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
int
|
int
|
||||||
pthread_barrierattr_init (pthread_barrierattr_t *attr)
|
pthread_barrierattr_init (pthread_barrierattr_t *attr)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T);
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_barrierattr_t,
|
||||||
|
struct pthread_barrierattr);
|
||||||
|
|
||||||
((struct pthread_barrierattr *) attr)->pshared = PTHREAD_PROCESS_PRIVATE;
|
((struct pthread_barrierattr *) attr)->pshared = PTHREAD_PROCESS_PRIVATE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
int
|
int
|
||||||
__pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *cond_attr)
|
__pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *cond_attr)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_cond_t, __SIZEOF_PTHREAD_COND_T);
|
||||||
|
|
||||||
struct pthread_condattr *icond_attr = (struct pthread_condattr *) cond_attr;
|
struct pthread_condattr *icond_attr = (struct pthread_condattr *) cond_attr;
|
||||||
|
|
||||||
memset (cond, 0, sizeof (pthread_cond_t));
|
memset (cond, 0, sizeof (pthread_cond_t));
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
int
|
int
|
||||||
__pthread_condattr_init (pthread_condattr_t *attr)
|
__pthread_condattr_init (pthread_condattr_t *attr)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T);
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_condattr_t,
|
||||||
|
struct pthread_condattr);
|
||||||
|
|
||||||
struct pthread_condattr *iattr = (struct pthread_condattr *) attr;
|
struct pthread_condattr *iattr = (struct pthread_condattr *) attr;
|
||||||
/* Default is not pshared and CLOCK_REALTIME. */
|
/* Default is not pshared and CLOCK_REALTIME. */
|
||||||
iattr-> value = CLOCK_REALTIME << 1;
|
iattr-> value = CLOCK_REALTIME << 1;
|
||||||
|
@ -19,14 +19,12 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pthread_getattr_default_np (pthread_attr_t *out)
|
pthread_getattr_default_np (pthread_attr_t *out)
|
||||||
{
|
{
|
||||||
struct pthread_attr *real_out;
|
struct pthread_attr *real_out;
|
||||||
|
|
||||||
assert (sizeof (*out) >= sizeof (struct pthread_attr));
|
|
||||||
real_out = (struct pthread_attr *) out;
|
real_out = (struct pthread_attr *) out;
|
||||||
|
|
||||||
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
|
@ -58,7 +58,8 @@ __pthread_mutex_init (pthread_mutex_t *mutex,
|
|||||||
{
|
{
|
||||||
const struct pthread_mutexattr *imutexattr;
|
const struct pthread_mutexattr *imutexattr;
|
||||||
|
|
||||||
assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T);
|
ASSERT_TYPE_SIZE (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T);
|
||||||
|
|
||||||
ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers,
|
ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers,
|
||||||
__PTHREAD_MUTEX_NUSERS_OFFSET);
|
__PTHREAD_MUTEX_NUSERS_OFFSET);
|
||||||
ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind,
|
ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind,
|
||||||
|
@ -62,8 +62,6 @@ static int __pthread_mutex_lock_full (pthread_mutex_t *mutex)
|
|||||||
int
|
int
|
||||||
__pthread_mutex_lock (pthread_mutex_t *mutex)
|
__pthread_mutex_lock (pthread_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
assert (sizeof (mutex->__size) >= sizeof (mutex->__data));
|
|
||||||
|
|
||||||
unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
|
unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
|
||||||
|
|
||||||
LIBC_PROBE (mutex_entry, 1, mutex);
|
LIBC_PROBE (mutex_entry, 1, mutex);
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
int
|
int
|
||||||
__pthread_mutexattr_init (pthread_mutexattr_t *attr)
|
__pthread_mutexattr_init (pthread_mutexattr_t *attr)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T);
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_mutexattr_t,
|
||||||
|
struct pthread_mutexattr);
|
||||||
|
|
||||||
if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t))
|
if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t))
|
||||||
memset (attr, '\0', sizeof (*attr));
|
memset (attr, '\0', sizeof (*attr));
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@ int
|
|||||||
__pthread_rwlock_init (pthread_rwlock_t *rwlock,
|
__pthread_rwlock_init (pthread_rwlock_t *rwlock,
|
||||||
const pthread_rwlockattr_t *attr)
|
const pthread_rwlockattr_t *attr)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T);
|
||||||
|
|
||||||
const struct pthread_rwlockattr *iattr;
|
const struct pthread_rwlockattr *iattr;
|
||||||
|
|
||||||
iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr;
|
iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr;
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
int
|
int
|
||||||
pthread_rwlockattr_init (pthread_rwlockattr_t *attr)
|
pthread_rwlockattr_init (pthread_rwlockattr_t *attr)
|
||||||
{
|
{
|
||||||
|
ASSERT_TYPE_SIZE (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T);
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_rwlockattr_t,
|
||||||
|
struct pthread_rwlockattr);
|
||||||
|
|
||||||
struct pthread_rwlockattr *iattr;
|
struct pthread_rwlockattr *iattr;
|
||||||
|
|
||||||
iattr = (struct pthread_rwlockattr *) attr;
|
iattr = (struct pthread_rwlockattr *) attr;
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
@ -30,7 +29,6 @@ pthread_setattr_default_np (const pthread_attr_t *in)
|
|||||||
struct pthread_attr attrs;
|
struct pthread_attr attrs;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert (sizeof (*in) >= sizeof (struct pthread_attr));
|
|
||||||
real_in = (struct pthread_attr *) in;
|
real_in = (struct pthread_attr *) in;
|
||||||
|
|
||||||
/* Catch invalid values. */
|
/* Catch invalid values. */
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
int
|
int
|
||||||
__new_sem_init (sem_t *sem, int pshared, unsigned int value)
|
__new_sem_init (sem_t *sem, int pshared, unsigned int value)
|
||||||
{
|
{
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (sem_t, struct new_sem);
|
||||||
|
|
||||||
/* Parameter sanity check. */
|
/* Parameter sanity check. */
|
||||||
if (__glibc_unlikely (value > SEM_VALUE_MAX))
|
if (__glibc_unlikely (value > SEM_VALUE_MAX))
|
||||||
{
|
{
|
||||||
@ -68,6 +70,8 @@ int
|
|||||||
attribute_compat_text_section
|
attribute_compat_text_section
|
||||||
__old_sem_init (sem_t *sem, int pshared, unsigned int value)
|
__old_sem_init (sem_t *sem, int pshared, unsigned int value)
|
||||||
{
|
{
|
||||||
|
ASSERT_PTHREAD_INTERNAL_SIZE (sem_t, struct new_sem);
|
||||||
|
|
||||||
/* Parameter sanity check. */
|
/* Parameter sanity check. */
|
||||||
if (__glibc_unlikely (value > SEM_VALUE_MAX))
|
if (__glibc_unlikely (value > SEM_VALUE_MAX))
|
||||||
{
|
{
|
||||||
|
@ -1,95 +0,0 @@
|
|||||||
/* Copyright (C) 2005-2017 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
|
|
||||||
|
|
||||||
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>
|
|
||||||
|
|
||||||
static const struct
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
size_t expected;
|
|
||||||
size_t is;
|
|
||||||
} types[] =
|
|
||||||
{
|
|
||||||
#define T(t, c) \
|
|
||||||
{ #t, c, sizeof (t) }
|
|
||||||
T (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T),
|
|
||||||
T (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T),
|
|
||||||
T (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T),
|
|
||||||
T (pthread_cond_t, __SIZEOF_PTHREAD_COND_T),
|
|
||||||
T (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T),
|
|
||||||
T (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T),
|
|
||||||
T (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T),
|
|
||||||
T (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T),
|
|
||||||
T (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T)
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
do_test (void)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
#define TEST_TYPE(name) \
|
|
||||||
printf ("%s: ", #name); \
|
|
||||||
if (sizeof (name) != sizeof (((name *) 0)->__size)) \
|
|
||||||
{ \
|
|
||||||
printf ("expected %zu, is %zu\n", \
|
|
||||||
sizeof (((name *) 0)->__size), sizeof (name)); \
|
|
||||||
result = 1; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
puts ("OK")
|
|
||||||
|
|
||||||
TEST_TYPE (pthread_mutex_t);
|
|
||||||
TEST_TYPE (pthread_cond_t);
|
|
||||||
TEST_TYPE (pthread_rwlock_t);
|
|
||||||
|
|
||||||
#define TEST_TYPE2(name, internal) \
|
|
||||||
printf ("%s: ", #name); \
|
|
||||||
if (sizeof (((name *) 0)->__size) < sizeof (internal)) \
|
|
||||||
{ \
|
|
||||||
printf ("expected %zu, is %zu\n", \
|
|
||||||
sizeof (((name *) 0)->__size), sizeof (internal)); \
|
|
||||||
result = 1; \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
puts ("OK")
|
|
||||||
|
|
||||||
TEST_TYPE2 (pthread_attr_t, struct pthread_attr);
|
|
||||||
TEST_TYPE2 (pthread_mutexattr_t, struct pthread_mutexattr);
|
|
||||||
TEST_TYPE2 (pthread_condattr_t, struct pthread_condattr);
|
|
||||||
TEST_TYPE2 (pthread_rwlockattr_t, struct pthread_rwlockattr);
|
|
||||||
TEST_TYPE2 (pthread_barrier_t, struct pthread_barrier);
|
|
||||||
TEST_TYPE2 (pthread_barrierattr_t, struct pthread_barrierattr);
|
|
||||||
TEST_TYPE2 (sem_t, struct new_sem);
|
|
||||||
TEST_TYPE2 (sem_t, struct old_sem);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof (types) / sizeof (types[0]); ++i)
|
|
||||||
if (types[i].expected != types[i].is)
|
|
||||||
{
|
|
||||||
printf ("%s: expected %zu, is %zu\n",
|
|
||||||
types[i].name, types[i].expected, types[i].is);
|
|
||||||
result = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TEST_FUNCTION do_test ()
|
|
||||||
#include "../test-skeleton.c"
|
|
Reference in New Issue
Block a user