* gdbint.texinfo (Algorithms): Add new section describing the

Observer paradigm.
        (Top): Add menu entry to new observer appendix.
        * observer.texi: New file.
        * Makefile.in (GDBINT_DOC_SOURCE_INCLUDES): Add dependency on
        new observer.texi file.
This commit is contained in:
Joel Brobecker 2003-03-18 17:44:23 +00:00
parent 79b8ff3ee0
commit bcd7e15f07
4 changed files with 100 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2003-03-18 J. Brobecker <brobecker@gnat.com>
* gdbint.texinfo (Algorithms): Add new section describing the
Observer paradigm.
(Top): Add menu entry to new observer appendix.
* observer.texi: New file.
* Makefile.in (GDBINT_DOC_SOURCE_INCLUDES): Add dependency on
new observer.texi file.
2003-03-17 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (DATE): Delete. Remove date from titles. Mention

View File

@ -114,7 +114,8 @@ GDB_DOC_FILES = \
# Internals Manual
GDBINT_DOC_SOURCE_INCLUDES = \
$(srcdir)/fdl.texi
$(srcdir)/fdl.texi \
$(srcdir)/observer.texi
GDBINT_DOC_BUILD_INCLUDES = \
gdb-cfg.texi \
GDBvn.texi

View File

@ -94,6 +94,7 @@ as the mechanisms that adapt @value{GDBN} to specific hosts and targets.
* Testsuite::
* Hints::
* GDB Observers:: @value{GDBN} Currently available observers
* GNU Free Documentation License:: The license for this documentation
* Index::
@end menu
@ -696,6 +697,29 @@ watchpoints might interfere with the underlying OS and are probably
unavailable in many platforms.
@end enumerate
@section Observing changes in @value{GDBN} internals
@cindex observer pattern interface
@cindex notifications about changes in internals
In order to function properly, several modules need to be notified when
some changes occur in the @value{GDBN} internals. Traditionally, these
modules have relied on several paradigms, the most common ones being
hooks and gdb-events. Unfortunately, none of these paradigms was
versatile enough to become the standard notification mechanism in
@value{GDBN}. The fact that they only supported one ``client'' was also
a strong limitation.
A new paradigm, based on the Observer pattern of the @cite{Design
Patterns} book, has therefore been implemented. The goal was to provide
a new interface overcoming the issues with the notification mechanisms
previously available. This new interface needed to be strongly typed,
easy to extend, and versatile enough to be used as the standard
interface when adding new notifications.
See @ref{GDB Observers} for a brief description of the observers
currently implemented in GDB. The rationale for the current
implementation is also briefly discussed.
@node User Interface
@chapter User Interface
@ -6595,6 +6619,7 @@ is so old that it has never been converted to use BFD. Now that's old!
@end table
@include observer.texi
@include fdl.texi
@node Index

64
gdb/doc/observer.texi Normal file
View File

@ -0,0 +1,64 @@
@c -*-texinfo-*-
@node GDB Observers
@appendix @value{GDBN} Currently available observers
@section Implementation rationale
@cindex observers implementation rationale
An @dfn{observer} is an entity which is interested in being notified
when GDB reaches certain states, or certain events occur in GDB.
The entity being observed is called the @dfn{subject}. To receive
notifications, the observer attaches a callback to the subject.
One subject can have several observers.
@file{observer.c} implements an internal generic low-level event
notification mechanism. This generic event notification mechansim is
then re-used to implement the exported high-level notification
management routines for all possible notifications.
The current implementation of the generic observer provides support
for contextual data. This contextual data is given to the subject
when attaching the callback. In return, the subject will provide
this contextual data back to the observer as a parameter of the
callback.
Note that the current support for the contextual data is only partial,
as it lacks a mechanism that would deallocate this data when the
callback is detached. This is not a problem so far, as this contextual
data is only used internally to hold a function pointer. Later on, if
a certain observer needs to provide support for user-level contextual
data, then the generic notification mechanism will need need to be
enhanced to allow the observer to provide a routine to deallocate the
data when attaching the callback.
The observer implementation is also currently not reentrant.
In particular, it is therefore not possible to call the attach
or detach routines during a notification.
@section @code{normal_stop} Notifications
@cindex @code{normal_stop} observer
@cindex notification about inferior execution stop
@value{GDBN} will notify all @code{normal_stop} observers when the
inferior execution has just stopped, and all the associated internal
processing (such as breakpoint commands, annotations, etc) is about to
be performed before the @value{GDBN} prompt is returned to the user.
The following interface is available to manage @code{normal_stop}
observers:
@deftypefun extern struct observer *observer_attach_normal_stop (observer_normal_stop_ftype *@var{f})
Attach the given @code{normal_stop} callback function @var{f} and
return the associated observer.
@end deftypefun
@deftypefun extern void observer_detach_normal_stop (struct observer *@var{observer});
Remove @var{observer} from the list of observers to be notified when
a @code{normal_stop} event occurs.
@end deftypefun
@deftypefun extern void observer_notify_normal_stop (void);
Send a notification to all @code{normal_stop} observers.
@end deftypefun