OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [gdb/] [testsuite/] [gdb.threads/] [fork-thread-pending.c] - Rev 330

Compare with Previous | Blame | View Log

/* This testcase is part of GDB, the GNU debugger.
 
   Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
#include <pthread.h>
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
 
#define NUMTHREADS 10
 
volatile int done = 0;
 
static void *
start (void *arg)
{
  while (!done)
    usleep (100);
  assert (0);
  return arg;
}
 
void *
thread_function (void *arg)
{
  int x = * (int *) arg;
 
  printf ("Thread <%d> executing\n", x);
 
  while (!done)
    usleep (100);
 
  return NULL;
}
 
void *
thread_forker (void *arg)
{
  int x = * (int *) arg;
  pid_t pid;
  int rv;
  int i;
  pthread_t thread;
 
  printf ("Thread forker <%d> executing\n", x);
 
  switch ((pid = fork ()))
    {
    case -1:
      assert (0);
    default:
      wait (&rv);
      done = 1;
      break;
    case 0:
      i = pthread_create (&thread, NULL, start, NULL);
      assert (i == 0);
      i = pthread_join (thread, NULL);
      assert (i == 0);
 
      assert (0);
    }
 
  return NULL;
}
 
int
main (void)
{
  pthread_t threads[NUMTHREADS];
  int args[NUMTHREADS];
  int i, j;
 
  /* Create a few threads that do mostly nothing, and then one that
     forks.  */
  for (j = 0; j < NUMTHREADS - 1; ++j)
    {
      args[j] = j;
      pthread_create (&threads[j], NULL, thread_function, &args[j]);
    }
 
  args[j] = j;
  pthread_create (&threads[j], NULL, thread_forker, &args[j]);
 
  for (j = 0; j < NUMTHREADS; ++j)
    {
      pthread_join (threads[j], NULL);
    }
 
  return 0;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.