hjl / source-git / glibc

Forked from source-git/glibc 3 years ago
Clone

Blame nptl/tst-audit-threads.c

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