/* Pthreads test program.
Copyright 1996-2024 Free Software Foundation, Inc.
Written by Fred Fish of Cygnus Support
Contributed by Cygnus Support
This file is part of GDB.
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 . */
#include
#include
#include
#include
#include
#include
static int verbose = 0;
static void
common_routine (int arg)
{
static int from_thread1;
static int from_thread2;
static int from_main;
static int hits;
static int full_coverage;
if (verbose)
printf ("common_routine (%d)\n", arg);
hits++;
switch (arg)
{
case 0:
from_main++;
break;
case 1:
from_thread1++;
break;
case 2:
from_thread2++;
break;
}
if (from_main && from_thread1 && from_thread2)
full_coverage = 1;
}
static void *
thread1 (void *arg)
{
int i;
int z = 0;
if (verbose)
printf ("thread1 (%0lx) ; pid = %d\n", (long) arg, getpid ());
for (i = 1; i <= 10000000; i++)
{
if (verbose)
printf ("thread1 %ld\n", (long) pthread_self ());
z += i;
common_routine (1);
sleep (1);
}
return (void *) 0;
}
static void *
thread2 (void * arg)
{
int i;
int k = 0;
if (verbose)
printf ("thread2 (%0lx) ; pid = %d\n", (long) arg, getpid ());
for (i = 1; i <= 10000000; i++)
{
if (verbose)
printf ("thread2 %ld\n", (long) pthread_self ());
k += i;
common_routine (2);
sleep (1);
}
sleep (100);
return (void *) 0;
}
void
foo (int a, int b, int c)
{
int d, e, f;
if (verbose)
printf ("a=%d\n", a);
}
/* Similar to perror, but use ERR instead of errno. */
static void
print_error (const char *ctx, int err)
{
fprintf (stderr, "%s: %s (%d)\n", ctx, strerror (err), err);
}
int
main (int argc, char **argv)
{
pthread_t tid1, tid2;
int j;
int t = 0;
void (*xxx) ();
pthread_attr_t attr;
int res;
if (verbose)
printf ("pid = %d\n", getpid ());
foo (1, 2, 3);
res = pthread_attr_init (&attr);
if (res != 0)
{
print_error ("pthread_attr_init 1", res);
exit (1);
}
#ifdef PTHREAD_SCOPE_SYSTEM
res = pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
if (res != 0 && res != ENOTSUP)
{
print_error ("pthread_attr_setscope 1", res);
exit (1);
}
#endif
res = pthread_create (&tid1, &attr, thread1, (void *) 0xfeedface);
if (res != 0)
{
print_error ("pthread_create 1", res);
exit (1);
}
if (verbose)
printf ("Made thread %ld\n", (long) tid1);
sleep (1);
res = pthread_create (&tid2, NULL, thread2, (void *) 0xdeadbeef);
if (res != 0)
{
print_error ("pthread_create 2", res);
exit (1);
}
if (verbose)
printf ("Made thread %ld\n", (long) tid2);
sleep (1);
for (j = 1; j <= 10000000; j++)
{
if (verbose)
printf ("top %ld\n", (long) pthread_self ());
common_routine (0);
sleep (1);
t += j;
}
exit (0);
}