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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [gdb/] [testsuite/] [gdb.threads/] [sigthread.c] - Diff between revs 24 and 157

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 24 Rev 157
/* Test case for C-c sent to threads with pending signals.  Before I
/* Test case for C-c sent to threads with pending signals.  Before I
   even get there, creating a thread and sending it a signal before it
   even get there, creating a thread and sending it a signal before it
   has a chance to run leads to an internal error in GDB.  We need to
   has a chance to run leads to an internal error in GDB.  We need to
   record that there's a pending SIGSTOP, so that we'll ignore it
   record that there's a pending SIGSTOP, so that we'll ignore it
   later, and pass the current signal back to the thread.
   later, and pass the current signal back to the thread.
 
 
   The fork/vfork case has similar trouble but that's even harder
   The fork/vfork case has similar trouble but that's even harder
   to get around.  We may need to send a SIGCONT to cancel out the
   to get around.  We may need to send a SIGCONT to cancel out the
   SIGSTOP.  Different kernels may do different things if the thread
   SIGSTOP.  Different kernels may do different things if the thread
   is stopped by ptrace and sent a SIGSTOP.  */
   is stopped by ptrace and sent a SIGSTOP.  */
 
 
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdlib.h>
#include <pthread.h>
#include <pthread.h>
#include <signal.h>
#include <signal.h>
 
 
/* Loop long enough for GDB to send a few signals of its own, but
/* Loop long enough for GDB to send a few signals of its own, but
   don't hang around eating CPU forever if something goes wrong during
   don't hang around eating CPU forever if something goes wrong during
   testing.  */
   testing.  */
#define NSIGS 10000000
#define NSIGS 10000000
 
 
pthread_barrier_t barrier;
pthread_barrier_t barrier;
 
 
void
void
handler (int sig)
handler (int sig)
{
{
  ;
  ;
}
}
 
 
pthread_t main_thread;
pthread_t main_thread;
pthread_t child_thread, child_thread_two;
pthread_t child_thread, child_thread_two;
 
 
void *
void *
child_two (void *arg)
child_two (void *arg)
{
{
  int i;
  int i;
 
 
  pthread_barrier_wait (&barrier);
  pthread_barrier_wait (&barrier);
 
 
  for (i = 0; i < NSIGS; i++)
  for (i = 0; i < NSIGS; i++)
    pthread_kill (child_thread, SIGUSR1);
    pthread_kill (child_thread, SIGUSR1);
}
}
 
 
void *
void *
thread_function (void *arg)
thread_function (void *arg)
{
{
  int i;
  int i;
 
 
  pthread_barrier_wait (&barrier);
  pthread_barrier_wait (&barrier);
 
 
  for (i = 0; i < NSIGS; i++)
  for (i = 0; i < NSIGS; i++)
    pthread_kill (child_thread_two, SIGUSR2);
    pthread_kill (child_thread_two, SIGUSR2);
}
}
 
 
int main()
int main()
{
{
  int i;
  int i;
 
 
  signal (SIGUSR1, handler);
  signal (SIGUSR1, handler);
  signal (SIGUSR2, handler);
  signal (SIGUSR2, handler);
 
 
  pthread_barrier_init (&barrier, NULL, 3);
  pthread_barrier_init (&barrier, NULL, 3);
 
 
  main_thread = pthread_self ();
  main_thread = pthread_self ();
  pthread_create (&child_thread, NULL, thread_function, NULL);
  pthread_create (&child_thread, NULL, thread_function, NULL);
  pthread_create (&child_thread_two, NULL, child_two, NULL);
  pthread_create (&child_thread_two, NULL, child_two, NULL);
 
 
  pthread_barrier_wait (&barrier);
  pthread_barrier_wait (&barrier);
 
 
  for (i = 0; i < NSIGS; i++)
  for (i = 0; i < NSIGS; i++)
    pthread_kill (child_thread_two, SIGUSR1);
    pthread_kill (child_thread_two, SIGUSR1);
 
 
  pthread_join (child_thread, NULL);
  pthread_join (child_thread, NULL);
 
 
  exit (0);
  exit (0);
}
}
 
 

powered by: WebSVN 2.1.0

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