+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.
 
   ** 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:
 
 
+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.
 
 @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
 
 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,
 
   eventregistry_object *cont;
   eventregistry_object *exited;
   eventregistry_object *new_objfile;
+  eventregistry_object *clear_objfiles;
 
   PyObject *module;
 
 
   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)
 
 }
 
 /* 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);
 }
 
 
 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)
                       "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);
 
   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)
 
       || 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;
 
+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.
 
 
 #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.*
 
     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."""
 
 
     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 ()