Sync with GCC:
[deliverable/binutils-gdb.git] / gdb / observer.c
index c331112951e66461b9eea1708d573b8fff4bde31..106bfcd1521ad623d299e82047425cad05c8bdde 100644 (file)
@@ -1,11 +1,12 @@
 /* GDB Notifications to Observers.
-   Copyright 2003 Free Software Foundation, Inc.
+
+   Copyright (C) 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -14,9 +15,7 @@
    GNU General Public License for more details.
 
    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.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* 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.  */
 
@@ -95,9 +104,9 @@ xfree_observer_list_node (struct observer_list *node)
   xfree (node);
 }
 
-/* Attach the callback NOTIFY to a subject represented by its list
-   of observers LIST.  The DATA is also stored, in order for the subject
-   to provide it back to the observer during a notification.  */
+/* Attach the callback NOTIFY to a SUBJECT.  The DATA is also stored,
+   in order for the subject to provide it back to the observer during
+   a notification.  */
 
 static struct observer *
 generic_observer_attach (struct observer_list **subject,
@@ -114,10 +123,9 @@ generic_observer_attach (struct observer_list **subject,
   return observer_list->observer;
 }
 
-/* Remove the given OBSERVER from the list of observers that need
-   to be notified by the subject represented by its LIST of observers.
-   Once detached, OBSERVER should no longer be used, as it is no longer
-   valid.  */
+/* Remove the given OBSERVER from the SUBJECT.  Once detached, OBSERVER
+   should no longer be used, as it is no longer valid.  */
+
 static void
 generic_observer_detach (struct observer_list **subject,
                         const struct observer *observer)
@@ -142,12 +150,11 @@ 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 a subject represented by
-   its LIST of observers.  ARGS is passed to all observers as an argument
-   to the notification callback.  */
+/* Send a notification to all the observers of SUBJECT.  ARGS is passed to
+   all observers as an argument to the notification callback.  */
 
 static void
 generic_observer_notify (struct observer_list *subject, const void *args)
@@ -161,34 +168,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 (int arg)
 {
-  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 (int arg)
 {
-  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 (int arg)
 {
-  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"
This page took 0.025867 seconds and 4 git commands to generate.