f66713d24a
* python/py-inferior.c (infpy_threads): Call update_thread_list (). gdb/testsuite/ * gdb.python/py-inferior.c (thread): New function. (check_threads): New function. (test_threads): New function. * gdb.python/py-inferior.exp: Added test. Replaced runto with continue to breakpoint.
92 lines
1.7 KiB
C
92 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <pthread.h>
|
|
|
|
#define CHUNK_SIZE 16000 /* same as findcmd.c's */
|
|
#define BUF_SIZE (2 * CHUNK_SIZE) /* at least two chunks */
|
|
#define NUMTH 8
|
|
|
|
int8_t int8_search_buf[100];
|
|
int16_t int16_search_buf[100];
|
|
int32_t int32_search_buf[100];
|
|
int64_t int64_search_buf[100];
|
|
|
|
static char *search_buf;
|
|
static int search_buf_size;
|
|
|
|
|
|
int f2 (int a)
|
|
{
|
|
/* We use a `char[]' type below rather than the typical `char *'
|
|
to make sure that `str' gets allocated on the stack. Otherwise,
|
|
the compiler may place the "hello, testsuite" string inside
|
|
a read-only section, preventing us from over-writing it from GDB. */
|
|
char str[] = "hello, testsuite";
|
|
|
|
puts (str); /* Break here. */
|
|
|
|
return ++a;
|
|
}
|
|
|
|
int f1 (int a, int b)
|
|
{
|
|
return f2(a) + b;
|
|
}
|
|
|
|
static void
|
|
init_bufs ()
|
|
{
|
|
search_buf_size = BUF_SIZE;
|
|
search_buf = malloc (search_buf_size);
|
|
if (search_buf == NULL)
|
|
exit (1);
|
|
memset (search_buf, 'x', search_buf_size);
|
|
}
|
|
|
|
static void *
|
|
thread (void *param)
|
|
{
|
|
pthread_barrier_t *barrier = (pthread_barrier_t *) param;
|
|
|
|
pthread_barrier_wait (barrier);
|
|
|
|
return param;
|
|
}
|
|
|
|
static void
|
|
check_threads (pthread_barrier_t *barrier)
|
|
{
|
|
pthread_barrier_wait (barrier);
|
|
}
|
|
|
|
extern int
|
|
test_threads (void)
|
|
{
|
|
pthread_t threads[NUMTH];
|
|
pthread_barrier_t barrier;
|
|
int i;
|
|
|
|
pthread_barrier_init (&barrier, NULL, NUMTH + 1);
|
|
|
|
for (i = 0; i < NUMTH; ++i)
|
|
pthread_create (&threads[i], NULL, thread, &barrier);
|
|
|
|
check_threads (&barrier);
|
|
|
|
for (i = 0; i < NUMTH; ++i)
|
|
pthread_join (threads[i], NULL);
|
|
|
|
pthread_barrier_destroy (&barrier);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
test_threads ();
|
|
init_bufs ();
|
|
|
|
return f1 (1, 2);
|
|
}
|