2006-10-08 Paul Brook <paul@codesourcery.com>
[binutils-gdb.git] / gdb / observer.c
index 92ec48e614fb261726018d684f21aa7f62e6f601..d3c276ebca97fe73dcd9b18221c3b07ecc4ebdd4 100644 (file)
@@ -1,5 +1,6 @@
 /* GDB Notifications to Observers.
-   Copyright 2003 Free Software Foundation, Inc.
+
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -15,8 +16,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* An observer is an entity who is interested in being notified when GDB
    reaches certain states, or certain events occur in GDB. The entity being
 
 #include "defs.h"
 #include "observer.h"
+#include "command.h"
+#include "gdbcmd.h"
+
+static int observer_debug;
+static void
+show_observer_debug (struct ui_file *file, int from_tty,
+                    struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Observer debugging is %s.\n"), value);
+}
 
 /* The internal generic observer.  */
 
@@ -141,7 +152,7 @@ generic_observer_detach (struct observer_list **subject,
 
   /* We should never reach this point.  However, this should not be
      a very serious error, so simply report a warning to the user.  */
-  warning ("Failed to detach observer");
+  warning (_("Failed to detach observer"));
 }
 
 /* Send a notification to all the observers of SUBJECT.  ARGS is passed to
@@ -159,34 +170,49 @@ generic_observer_notify (struct observer_list *subject, const void *args)
     }
 }
 
-/* normal_stop notifications.  */
 
-static struct observer_list *normal_stop_subject = NULL;
+/* The following code is only used to unit-test the observers from our
+   testsuite.  DO NOT USE IT within observer.c (or anywhere else for
+   that matter)!  */
 
-static void
-observer_normal_stop_notification_stub (const void *data,
-                                       const void *unused_args)
+/* If we define these variables and functions as `static', the
+   compiler will optimize them out.  */
+int observer_test_first_observer = 0;
+int observer_test_second_observer = 0;
+int observer_test_third_observer = 0;
+
+void
+observer_test_first_notification_function (struct bpstats *bs)
 {
-  observer_normal_stop_ftype *notify = (observer_normal_stop_ftype *) data;
-  (*notify) ();
+  observer_test_first_observer++;
 }
 
-struct observer *
-observer_attach_normal_stop (observer_normal_stop_ftype *f)
+void
+observer_test_second_notification_function (struct bpstats *bs)
 {
-  return generic_observer_attach (&normal_stop_subject,
-                                 &observer_normal_stop_notification_stub,
-                                 (void *) f);
+  observer_test_second_observer++;
 }
 
 void
-observer_detach_normal_stop (struct observer *observer)
+observer_test_third_notification_function (struct bpstats *bs)
 {
-  generic_observer_detach (&normal_stop_subject, observer);
+  observer_test_third_observer++;
 }
 
+extern initialize_file_ftype _initialize_observer; /* -Wmissing-prototypes */
+
 void
-observer_notify_normal_stop (void)
+_initialize_observer (void)
 {
-  generic_observer_notify (normal_stop_subject, NULL);
+  add_setshow_zinteger_cmd ("observer", class_maintenance,
+                           &observer_debug, _("\
+Set observer debugging."), _("\
+Show observer debugging."), _("\
+When non-zero, observer debugging is enabled."),
+                           NULL,
+                           show_observer_debug,
+                           &setdebuglist, &showdebuglist);
 }
+
+#include "observer.inc"