Blame nptl/tst-kill4.c

Packit 6c4009
/* Copyright (C) 2003-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <pthread.h>
Packit 6c4009
#include <signal.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf (void *a)
Packit 6c4009
{
Packit 6c4009
  return NULL;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  pthread_attr_t at;
Packit 6c4009
  if (pthread_attr_init (&at) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("attr_create failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* Limit thread stack size, because if it is too large, pthread_join
Packit 6c4009
     will free it immediately rather than put it into stack cache.  */
Packit 6c4009
  if (pthread_attr_setstacksize (&at, 2 * 1024 * 1024) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("setstacksize failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  pthread_t th;
Packit 6c4009
  if (pthread_create (&th, &at, tf, NULL) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("create failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  pthread_attr_destroy (&at);
Packit 6c4009
Packit 6c4009
  if (pthread_join (th, NULL) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("join failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* The following only works because we assume here something about
Packit 6c4009
     the implementation.  Namely, that the memory allocated for the
Packit 6c4009
     thread descriptor is not going away, that the TID field is
Packit 6c4009
     cleared and therefore the signal is sent to process 0, and that
Packit 6c4009
     we can savely assume there is no other process with this ID at
Packit 6c4009
     that time.  */
Packit 6c4009
  int e = pthread_kill (th, 0);
Packit 6c4009
  if (e == 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("pthread_kill succeeded");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
  if (e != ESRCH)
Packit 6c4009
    {
Packit 6c4009
      puts ("pthread_kill didn't return ESRCH");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"