/* CPU Affinity inheritance test - pthread_{gs}etaffinity_np.
   Copyright The GNU Toolchain Authors.
   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
   <https://www.gnu.org/licenses/>.  */

/* See top level comment in nptl/tst-skeleton-affinity-inheritance.c for a
   description of this test.  */
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <string.h>
#include <support/check.h>

static void
set_my_affinity (size_t size, const cpu_set_t *set)
{
  int ret = pthread_setaffinity_np (pthread_self (), size, set);

  if (ret != 0)
    FAIL ("pthread_setaffinity_np returned %d (%s)", ret, strerror (ret));
}

static void
verify_my_affinity (int nproc, int nproc_configured, size_t size,
		    const cpu_set_t *expected_set)
{
  cpu_set_t *set = CPU_ALLOC (nproc_configured);
  cpu_set_t *xor_set = CPU_ALLOC (nproc_configured);

  if (set == NULL || xor_set== NULL)
    FAIL_EXIT1 ("verify_my_affinity: Failed to allocate cpuset: %m\n");

  int ret = pthread_getaffinity_np (pthread_self (), size, set);
  if (ret != 0)
    FAIL ("pthread_getaffinity_np returned %d (%s)", ret, strerror (ret));

  CPU_XOR_S (size, xor_set, expected_set, set);

  int cpucount = CPU_COUNT_S (size, xor_set);

  if (cpucount > 0)
    {
      FAIL ("Affinity mask not inherited, "
	    "following %d CPUs mismatched in the expected and actual sets: ",
	    cpucount);
      for (int cur = 0; cur < nproc && cpucount >= 0; cur++)
	if (CPU_ISSET_S (size, cur, xor_set))
	  {
	    printf ("%d ", cur);
	    cpucount--;
	  }
      printf ("\n");
    }

  CPU_FREE (set);
  CPU_FREE (xor_set);
}

#include "tst-skeleton-affinity-inheritance.c"
