/* GDB Notifications to Observers.
- Copyright 2003 Free Software Foundation, Inc.
+
+ Copyright 2003, 2004 Free Software Foundation, Inc.
This file is part of GDB.
#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. */
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,
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)
/* 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)
}
}
-/* 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"