New python event "clear_objfiles".
authorDoug Evans <dje@google.com>
Fri, 17 Oct 2014 18:12:17 +0000 (11:12 -0700)
committerDoug Evans <dje@google.com>
Fri, 17 Oct 2014 18:12:17 +0000 (11:12 -0700)
If one is watching new_objfile events in python, it helps to know
when the list of objfiles is cleared.  This patch adds a new
clear_objfiles event to support this.

This patch is all just cut-n-paste-n-tweak derived from
the new_objfiles event.

gdb/ChangeLog:

* NEWS: Mention new event gdb.clear_objfiles.
* python/py-event.h (emit_clear_objfiles_event): Clear
* python/py-events.h (events_object): New member clear_objfiles.
* python/py-evts.c (gdbpy_initialize_py_events): Add clear_objfiles
event.
* python/py-inferior.c (python_new_objfile): If objfile is NULL,
emit clear_objfiles event.
* python/py-newobjfileevent.c (create_clear_objfiles_event_object): New
function.
(emit_clear_objfiles_event): New function.
(clear_objfiles): New event.
* python/python-internal.h (gdbpy_initialize_clear_objfiles_event):
Declare.
* python/python.c (_initialize_python): Call
gdbpy_initialize_clear_objfiles_event.

gdb/doc/ChangeLog:

* python.texi (Events In Python): Document clear_objfiles event.

gdb/testsuite/ChangeLog:

* gdb.python/py-events.exp: Update expected output for clear_objfiles
event.
* gdb.python/py-events.py: Add clear_objfiles event.

14 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/python/py-event.h
gdb/python/py-events.h
gdb/python/py-evts.c
gdb/python/py-inferior.c
gdb/python/py-newobjfileevent.c
gdb/python/python-internal.h
gdb/python/python.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-events.exp
gdb/testsuite/gdb.python/py-events.py

index 4122ad0dd5fdefff692e6bcd675fd089cf503ada..97cab79616b29fc2a6f7bd480fae24b6e9a70349 100644 (file)
@@ -1,3 +1,21 @@
+2014-10-17  Doug Evans  <dje@google.com>
+
+       * NEWS: Mention new event gdb.clear_objfiles.
+       * python/py-event.h (emit_clear_objfiles_event): Clear
+       * python/py-events.h (events_object): New member clear_objfiles.
+       * python/py-evts.c (gdbpy_initialize_py_events): Add clear_objfiles
+       event.
+       * python/py-inferior.c (python_new_objfile): If objfile is NULL,
+       emit clear_objfiles event.
+       * python/py-newobjfileevent.c (create_clear_objfiles_event_object): New
+       function.
+       (emit_clear_objfiles_event): New function.
+       (clear_objfiles): New event.
+       * python/python-internal.h (gdbpy_initialize_clear_objfiles_event):
+       Declare.
+       * python/python.c (_initialize_python): Call
+       gdbpy_initialize_clear_objfiles_event.
+
 2014-10-17  Doug Evans  <dje@google.com>
 
        * NEWS: Mention new gdb.Objfile.progspace attribute.
index 76b44e83db432f3817bc1bcbb8161d7e741ebf2e..606fd162b01e6d006438fedf15b2ed7c7de7a980 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -11,6 +11,8 @@
   ** New attribute 'producer' for gdb.Symtab objects.
   ** gdb.Objfile objects have a new attribute "progspace",
      which is the gdb.Progspace object of the containing program space.
+  ** A new event "gdb.clear_objfiles" has been added, triggered when
+     selecting a new file to debug.
 
 * New Python-based convenience functions:
 
index 8c00c3233ff9b1c44431640e8dcee365f1c683d2..474c1af479410cd329bcfa31c29299383118019c 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-17  Doug Evans  <dje@google.com>
+
+       * python.texi (Events In Python): Document clear_objfiles event.
+
 2014-10-17  Doug Evans  <dje@google.com>
 
        * python.texi (Objfiles In Python): Document new progspace attribute.
index 84d66378da2940e8dabf820d434529cc9c26bc3e..43663d8b444757e4ac32ad8a335edc445af63b29 100644 (file)
@@ -2728,6 +2728,16 @@ A reference to the object file (@code{gdb.Objfile}) which has been loaded.
 @xref{Objfiles In Python}, for details of the @code{gdb.Objfile} object.
 @end defvar
 
+@item events.clear_objfiles
+Emits @code{gdb.ClearObjFilesEvent} which indicates that the list of object
+files for a program space has been reset.
+@code{gdb.ClearObjFilesEvent} has one attribute:
+
+@defvar ClearObjFilesEvent.progspace
+A reference to the program space (@code{gdb.Progspace}) whose objfile list has
+been cleared.  @xref{Progspaces In Python}.
+@end defvar
+
 @end table
 
 @node Threads In Python
index 5a0f29b8cf5f95fee8c90edb11af5c2b7e7a522c..c0bd9a6f6432767186ae50a824e986099cf8faf1 100644 (file)
@@ -112,6 +112,7 @@ extern int evpy_emit_event (PyObject *event,
 extern PyObject *create_event_object (PyTypeObject *py_type);
 extern PyObject *create_thread_event_object (PyTypeObject *py_type);
 extern int emit_new_objfile_event (struct objfile *objfile);
+extern int emit_clear_objfiles_event (void);
 
 extern void evpy_dealloc (PyObject *self);
 extern int evpy_add_attribute (PyObject *event,
index 34316124bbf5d72c56d3668248bf6742ebca1e8b..0b5656b48cd2a5c5f9449755c05a60db60bca9c9 100644 (file)
@@ -46,6 +46,7 @@ typedef struct
   eventregistry_object *cont;
   eventregistry_object *exited;
   eventregistry_object *new_objfile;
+  eventregistry_object *clear_objfiles;
 
   PyObject *module;
 
index a7daf8aa6952cd1413926deec280b9373211746c..d08b14b836a1c5063dd3547a7e3d793f05df7254 100644 (file)
@@ -76,6 +76,9 @@ gdbpy_initialize_py_events (void)
   if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0)
     return -1;
 
+  if (add_new_registry (&gdb_py_events.clear_objfiles, "clear_objfiles") < 0)
+    return -1;
+
   if (gdb_pymodule_addobject (gdb_module,
                              "events",
                              (PyObject *) gdb_py_events.module) < 0)
index 181059abcc024cf134e4877b6fa40ea9367a5fd3..1b38d55d55766079ca2fa095b6280d2e745e8c61 100644 (file)
@@ -137,23 +137,32 @@ python_inferior_exit (struct inferior *inf)
 }
 
 /* Callback used to notify Python listeners about new objfiles loaded in the
-   inferior.  */
+   inferior.  OBJFILE may be NULL which means that the objfile list has been
+   cleared (emptied).  */
 
 static void
 python_new_objfile (struct objfile *objfile)
 {
   struct cleanup *cleanup;
 
-  if (objfile == NULL)
-    return;
-
   if (!gdb_python_initialized)
     return;
 
-  cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
+  cleanup = ensure_python_env (objfile != NULL
+                              ? get_objfile_arch (objfile)
+                              : target_gdbarch (),
+                              current_language);
 
-  if (emit_new_objfile_event (objfile) < 0)
-    gdbpy_print_stack ();
+  if (objfile == NULL)
+    {
+      if (emit_clear_objfiles_event () < 0)
+       gdbpy_print_stack ();
+    }
+  else
+    {
+      if (emit_new_objfile_event (objfile) < 0)
+       gdbpy_print_stack ();
+    }
 
   do_cleanups (cleanup);
 }
index e4e13515ed504c95ded0c2c3c21c45b1afcab4e8..104ed078b5f898887d456012eb00076624746788 100644 (file)
@@ -22,6 +22,8 @@
 
 static PyTypeObject new_objfile_event_object_type
     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
+static PyTypeObject clear_objfiles_event_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object");
 
 static PyObject *
 create_new_objfile_event_object (struct objfile *objfile)
@@ -72,3 +74,56 @@ GDBPY_NEW_EVENT_TYPE (new_objfile,
                       "GDB new object file event object",
                       event_object_type,
                       static);
+\f
+/* Subroutine of emit_clear_objfiles_event to simplify it.  */
+
+static PyObject *
+create_clear_objfiles_event_object (void)
+{
+  PyObject *objfile_event;
+  PyObject *py_progspace;
+
+  objfile_event = create_event_object (&clear_objfiles_event_object_type);
+  if (!objfile_event)
+    goto fail;
+
+  /* Note that pspace_to_pspace_object returns a borrowed reference,
+     so we don't need a decref here.  */
+  py_progspace = pspace_to_pspace_object (current_program_space);
+  if (!py_progspace || evpy_add_attribute (objfile_event,
+                                          "progspace",
+                                          py_progspace) < 0)
+    goto fail;
+
+  return objfile_event;
+
+ fail:
+  Py_XDECREF (objfile_event);
+  return NULL;
+}
+
+/* Callback function which notifies observers when the "clear objfiles"
+   event occurs.
+   This function will create a new Python clear_objfiles event object.
+   Return -1 if emit fails.  */
+
+int
+emit_clear_objfiles_event (void)
+{
+  PyObject *event;
+
+  if (evregpy_no_listeners_p (gdb_py_events.clear_objfiles))
+    return 0;
+
+  event = create_clear_objfiles_event_object ();
+  if (event)
+    return evpy_emit_event (event, gdb_py_events.clear_objfiles);
+  return -1;
+}
+
+GDBPY_NEW_EVENT_TYPE (clear_objfiles,
+                     "gdb.ClearObjFilesEvent",
+                     "ClearObjFilesEvent",
+                     "GDB clear object files event object",
+                     event_object_type,
+                     static);
index c262a46231e6deb8f0bfc139366c30fd775a314b..54eebeb42b06675d1d57c828795b4223d7f7f2c8 100644 (file)
@@ -470,6 +470,8 @@ int gdbpy_initialize_thread_event (void)
   CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
 int gdbpy_initialize_new_objfile_event (void)
   CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
+int gdbpy_initialize_clear_objfiles_event (void)
+  CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
 int gdbpy_initialize_arch (void)
   CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
 int gdbpy_initialize_xmethods (void)
index af90bef0c0befa93cf613309d3442fda63b9f943..ca531e2e971cb54c72406ac0c33a7fbb27f94f93 100644 (file)
@@ -1756,6 +1756,7 @@ message == an error message without a stack will be printed."),
       || gdbpy_initialize_exited_event () < 0
       || gdbpy_initialize_thread_event () < 0
       || gdbpy_initialize_new_objfile_event ()  < 0
+      || gdbpy_initialize_clear_objfiles_event ()  < 0
       || gdbpy_initialize_arch () < 0
       || gdbpy_initialize_xmethods () < 0)
     goto fail;
index 129cd7a113f0d5eb58eeb749176ea22012e3786e..a4cb533c2af2897ab2a24fea1b91806474fab11e 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-17  Doug Evans  <dje@google.com>
+
+       * gdb.python/py-events.exp: Update expected output for clear_objfiles
+       event.
+       * gdb.python/py-events.py: Add clear_objfiles event.
+
 2014-10-17  Doug Evans  <dje@google.com>
 
        * gdb.python/py-objfile.exp: Test progspace attribute.
index 92de5508e7ee9f9de8b216403216dab1504a9db6..c4331fe8610054c756f0c9b43092bcf364862ef9 100644 (file)
@@ -81,6 +81,7 @@ delete_breakpoints
 
 #test exited event.
 gdb_test "continue" ".*event type: continue.*
+.*clear_objfiles\[\r\n\]*progspace: .*py-events.*
 .*event type: exit.*
 .*exit code: 12.*
 .*exit inf: 1.*
index 1f0012aace8236a464c94af2e4e5908f85916d54..9af768b49ea33b0c05dd645402a3df567ea34d67 100644 (file)
@@ -57,6 +57,11 @@ def new_objfile_handler (event):
     print ("event type: new_objfile")
     print ("new objfile name: %s" % (event.new_objfile.filename))
 
+def clear_objfiles_handler (event):
+    assert (isinstance (event, gdb.ClearObjFilesEvent))
+    print ("event type: clear_objfiles")
+    print ("progspace: %s" % (event.progspace.filename))
+
 class test_events (gdb.Command):
     """Test events."""
 
@@ -80,6 +85,7 @@ class test_newobj_events (gdb.Command):
 
     def invoke (self, arg, from_tty):
         gdb.events.new_objfile.connect (new_objfile_handler)
+        gdb.events.clear_objfiles.connect (clear_objfiles_handler)
         print ("Object file events registered.")
 
 test_newobj_events ()