gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 26 Jul 2012 19:09:35 +0000 (19:09 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 26 Jul 2012 19:09:35 +0000 (19:09 +0000)
* 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.

gdb/ChangeLog
gdb/python/py-inferior.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-inferior.c
gdb/testsuite/gdb.python/py-inferior.exp

index 80fb57ede2737ca66765370a7561e17698cd82c0..9ff2a653e272ed7b435e92a784c6220ff2d0031d 100644 (file)
@@ -1,3 +1,7 @@
+2012-07-26  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * python/py-inferior.c (infpy_threads): Call update_thread_list ().
+
 2012-07-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * auto-load.c (auto_load_info_scripts): Remove immediate_quit increment
index 2b229beeda6bdad43d75f3513580a09d91a70c68..907b73e8da8ff1c64f29813fda66e94ca657a530 100644 (file)
@@ -300,9 +300,14 @@ infpy_threads (PyObject *self, PyObject *args)
   struct threadlist_entry *entry;
   inferior_object *inf_obj = (inferior_object *) self;
   PyObject *tuple;
+  volatile struct gdb_exception except;
 
   INFPY_REQUIRE_VALID (inf_obj);
 
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    update_thread_list ();
+  GDB_PY_HANDLE_EXCEPTION (except);
+
   tuple = PyTuple_New (inf_obj->nthreads);
   if (!tuple)
     return NULL;
index 0c11c2b4a364a659bd020392a8904e0d2066204f..ba48b8df8ad7621b637efae8acb1c0f4bc9fc400 100644 (file)
@@ -1,3 +1,11 @@
+2012-07-26  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * 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.
+
 2012-07-26  Tom Tromey  <tromey@redhat.com>
 
        * lib/ada.exp (standard_ada_testfile): New proc.
index 04ec4769263c8caeb67456ed2758263b5a696bcd..3ee9a4620604ecd0f7676b70dc4cb189275b186d 100644 (file)
@@ -2,9 +2,11 @@
 #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];
@@ -43,8 +45,47 @@ init_bufs ()
   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);
index b40a514396536c2bd6ca633d6d0fbe772d8b18b8..15e684aa226a49cb09584601c97cbe53e38d2c62 100644 (file)
@@ -20,7 +20,7 @@ load_lib gdb-python.exp
 
 standard_testfile
 
-if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+if { [gdb_compile_pthreads ${srcdir}/${subdir}/${srcfile} ${binfile} executable {debug}] != "" } {
     return -1
 }
 
@@ -48,8 +48,6 @@ if ![runto_main] then {
     return 0
 }
 
-runto [gdb_get_line_number "Break here."]
-
 # Test basic gdb.Inferior attributes and methods.
 
 gdb_py_test_silent_cmd "python inferiors = gdb.inferiors ()" "get inferiors list" 1
@@ -62,6 +60,17 @@ gdb_test "python print 'result =', i0.pid" " = \[0-9\]+" "test Inferior.pid"
 gdb_test "python print 'result =', i0.was_attached" " = False" "test Inferior.was_attached"
 gdb_test "python print i0.threads ()" "\\(<gdb.InferiorThread object at 0x\[\[:xdigit:\]\]+>,\\)" "test Inferior.threads"
 
+# Test the number of inferior threads.
+
+gdb_breakpoint check_threads
+gdb_continue_to_breakpoint "cont to check_threads" ".*pthread_barrier_wait.*"
+gdb_test "python print len (i0.threads ())" "\r\n9" "test Inferior.threads 2"
+
+# Proceed to the next test.
+
+gdb_breakpoint [gdb_get_line_number "Break here."]
+gdb_continue_to_breakpoint "cont to Break here." ".*Break here\..*"
+
 # Test memory read and write operations.
 
 gdb_py_test_silent_cmd "python addr = gdb.selected_frame ().read_var ('str')" \