/* Copyright (C) 2005-2014 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"
