Back to index

glibc  2.9
Defines | Functions
tst-kill4.c File Reference
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "../test-skeleton.c"

Go to the source code of this file.

Defines

#define TEST_FUNCTION   do_test ()

Functions

static void * tf (void *a)
int do_test (void)

Define Documentation

#define TEST_FUNCTION   do_test ()

Definition at line 90 of file tst-kill4.c.


Function Documentation

int do_test ( void  )

Definition at line 36 of file tst-kill4.c.

{
  pthread_attr_t at;
  if (pthread_attr_init (&at) != 0)
    {
      puts ("attr_create failed");
      exit (1);
    }

  /* Limit thread stack size, because if it is too large, pthread_join
     will free it immediately rather than put it into stack cache.  */
  if (pthread_attr_setstacksize (&at, 2 * 1024 * 1024) != 0)
    {
      puts ("setstacksize failed");
      exit (1);
    }

  pthread_t th;
  if (pthread_create (&th, &at, tf, NULL) != 0)
    {
      puts ("create failed");
      exit (1);
    }

  pthread_attr_destroy (&at);

  if (pthread_join (th, NULL) != 0)
    {
      puts ("join failed");
      exit (1);
    }

  /* The following only works because we assume here something about
     the implementation.  Namely, that the memory allocated for the
     thread descriptor is not going away, that the the TID field is
     cleared and therefore the signal is sent to process 0, and that
     we can savely assume there is no other process with this ID at
     that time.  */
  int e = pthread_kill (th, 0);
  if (e == 0)
    {
      puts ("pthread_kill succeeded");
      exit (1);
    }
  if (e != ESRCH)
    {
      puts ("pthread_kill didn't return ESRCH");
      exit (1);
    }

  return 0;
}

Here is the call graph for this function:

static void* tf ( void *  a) [static]

Definition at line 29 of file tst-kill4.c.

{
  return NULL;
}