Welcome to mirror list, hosted at ThFree Co, Russian Federation.

threadidafterfork.c « pthread « winsup.api « testsuite « winsup - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 473eaecfd505a35ef35486b07cf4b78a5db71fa2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <stdlib.h>

static void * TestThread ( void * );

int main (void)
{
  pthread_t t;

  pthread_create (&t, NULL, TestThread, NULL);
  pthread_join (t, NULL);

  return 0;
}

static void * TestThread ( void *not_used )
{
  pthread_t iAm = pthread_self();
  int status;
  switch (fork ())
    {
    case -1:
      exit(1);
    case 0:
      if (iAm != pthread_self())
	  exit (1);
      else
	  exit (0);
      break;
    default:
      wait (&status);
      if (status != 0)
	  exit (1);
    }
  exit(0);
}

/*
The forked child will not get the same thread handle as its parent, it
will get the thread handle from the main thread instead. The child will
not terminate because the threadcount is still 2 after the fork (it is
set to 1 in MTinterface::Init and then set back to 2 after the childs
memory gets overwritten by the parent).

concept test by Thomas Pfaff <tpfaff@gmx.net>
scritable test by Robert Collins <rbtcollins@hotmail.com>
*/