Blame nptl/tst-audit-threads.c

Packit Service 0b8cad
/* Test multi-threading using LD_AUDIT.
Packit Service 0b8cad
Packit Service 0b8cad
   Copyright (C) 2018 Free Software Foundation, Inc.
Packit Service 0b8cad
   This file is part of the GNU C Library.
Packit Service 0b8cad
Packit Service 0b8cad
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 0b8cad
   modify it under the terms of the GNU Lesser General Public
Packit Service 0b8cad
   License as published by the Free Software Foundation; either
Packit Service 0b8cad
   version 2.1 of the License, or (at your option) any later version.
Packit Service 0b8cad
Packit Service 0b8cad
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 0b8cad
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 0b8cad
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 0b8cad
   Lesser General Public License for more details.
Packit Service 0b8cad
Packit Service 0b8cad
   You should have received a copy of the GNU Lesser General Public
Packit Service 0b8cad
   License along with the GNU C Library; if not, see
Packit Service 0b8cad
   <http://www.gnu.org/licenses/>.  */
Packit Service 0b8cad
Packit Service 0b8cad
/* This test uses a dummy LD_AUDIT library (test-audit-threads-mod1) and a
Packit Service 0b8cad
   library with a huge number of functions in order to validate lazy symbol
Packit Service 0b8cad
   binding with an audit library.  We use one thread per CPU to test that
Packit Service 0b8cad
   concurrent lazy resolution does not have any defects which would cause
Packit Service 0b8cad
   the process to fail.  We use an LD_AUDIT library to force the testing of
Packit Service 0b8cad
   the relocation resolution caching code in the dynamic loader i.e.
Packit Service 0b8cad
   _dl_runtime_profile and _dl_profile_fixup.  */
Packit Service 0b8cad
Packit Service 0b8cad
#include <support/xthread.h>
Packit Service 0b8cad
#include <strings.h>
Packit Service 0b8cad
#include <stdlib.h>
Packit Service 0b8cad
#include <sys/sysinfo.h>
Packit Service 0b8cad
Packit Service 0b8cad
static int do_test (void);
Packit Service 0b8cad
Packit Service 0b8cad
/* This test usually takes less than 3s to run.  However, there are cases that
Packit Service 0b8cad
   take up to 30s.  */
Packit Service 0b8cad
#define TIMEOUT 60
Packit Service 0b8cad
#define TEST_FUNCTION do_test ()
Packit Service 0b8cad
#include "../test-skeleton.c"
Packit Service 0b8cad
Packit Service 0b8cad
/* Declare the functions we are going to call.  */
Packit Service 0b8cad
#define externnum
Packit Service 0b8cad
#include "tst-audit-threads.h"
Packit Service 0b8cad
#undef externnum
Packit Service 0b8cad
Packit Service 0b8cad
int num_threads;
Packit Service 0b8cad
pthread_barrier_t barrier;
Packit Service 0b8cad
Packit Service 0b8cad
void
Packit Service 0b8cad
sync_all (int num)
Packit Service 0b8cad
{
Packit Service 0b8cad
  pthread_barrier_wait (&barrier);
Packit Service 0b8cad
}
Packit Service 0b8cad
Packit Service 0b8cad
void
Packit Service 0b8cad
call_all_ret_nums (void)
Packit Service 0b8cad
{
Packit Service 0b8cad
  /* Call each function one at a time from all threads.  */
Packit Service 0b8cad
#define callnum
Packit Service 0b8cad
#include "tst-audit-threads.h"
Packit Service 0b8cad
#undef callnum
Packit Service 0b8cad
}
Packit Service 0b8cad
Packit Service 0b8cad
void *
Packit Service 0b8cad
thread_main (void *unused)
Packit Service 0b8cad
{
Packit Service 0b8cad
  call_all_ret_nums ();
Packit Service 0b8cad
  return NULL;
Packit Service 0b8cad
}
Packit Service 0b8cad
Packit Service 0b8cad
#define STR2(X) #X
Packit Service 0b8cad
#define STR(X) STR2(X)
Packit Service 0b8cad
Packit Service 0b8cad
static int
Packit Service 0b8cad
do_test (void)
Packit Service 0b8cad
{
Packit Service 0b8cad
  int i;
Packit Service 0b8cad
  pthread_t *threads;
Packit Service 0b8cad
Packit Service 0b8cad
  num_threads = get_nprocs ();
Packit Service 0b8cad
  if (num_threads <= 1)
Packit Service 0b8cad
    num_threads = 2;
Packit Service 0b8cad
Packit Service 0b8cad
  /* Used to synchronize all the threads after calling each retNumN.  */
Packit Service 0b8cad
  xpthread_barrier_init (&barrier, NULL, num_threads);
Packit Service 0b8cad
Packit Service 0b8cad
  threads = (pthread_t *) xcalloc (num_threads, sizeof(pthread_t));
Packit Service 0b8cad
  for (i = 0; i < num_threads; i++)
Packit Service 0b8cad
    threads[i] = xpthread_create(NULL, thread_main, NULL);
Packit Service 0b8cad
Packit Service 0b8cad
  for (i = 0; i < num_threads; i++)
Packit Service 0b8cad
    xpthread_join(threads[i]);
Packit Service 0b8cad
Packit Service 0b8cad
  free (threads);
Packit Service 0b8cad
Packit Service 0b8cad
  return 0;
Packit Service 0b8cad
}