2009-10-05 20:04:44 +02:00
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2010-04-22 01:33:44 +02:00
< html xmlns = "http://www.w3.org/1999/xhtml" > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" / > < title > Developer Information< / title > < meta name = "generator" content = "DocBook XSL Stylesheets V1.75.2" / > < meta name = "keywords" content = " C++ , library , profile " / > < meta name = "keywords" content = " ISO C++ , library " / > < link rel = "home" href = "../spine.html" title = "The GNU C++ Library Documentation" / > < link rel = "up" href = "profile_mode.html" title = "Chapter 19. Profile Mode" / > < link rel = "prev" href = "bk01pt03ch19s05.html" title = "Implementation Issues" / > < link rel = "next" href = "bk01pt03ch19s07.html" title = "Diagnostics" / > < / head > < body > < div class = "navheader" > < table width = "100%" summary = "Navigation header" > < tr > < th colspan = "3" align = "center" > Developer Information< / th > < / tr > < tr > < td width = "20%" align = "left" > < a accesskey = "p" href = "bk01pt03ch19s05.html" > Prev< / a > < / td > < th width = "60%" align = "center" > Chapter 19. Profile Mode< / th > < td width = "20%" align = "right" > < a accesskey = "n" href = "bk01pt03ch19s07.html" > Next< / a > < / td > < / tr > < / table > < hr / > < / div > < div class = "sect1" title = "Developer Information" > < div class = "titlepage" > < div > < div > < h2 class = "title" style = "clear: both" > < a id = "manual.ext.profile_mode.developer" > < / a > Developer Information< / h2 > < / div > < / div > < / div > < div class = "sect2" title = "Big Picture" > < div class = "titlepage" > < div > < div > < h3 class = "title" > < a id = "manual.ext.profile_mode.developer.bigpic" > < / a > Big Picture< / h3 > < / div > < / div > < / div > < p > The profile mode headers are included with
< code class = "code" > -D_GLIBCXX_PROFILE< / code > through preprocessor directives in
2009-10-05 20:04:44 +02:00
< code class = "code" > include/std/*< / code > .
2010-04-22 01:33:44 +02:00
< / p > < p > Instrumented implementations are provided in
2009-10-05 20:04:44 +02:00
< code class = "code" > include/profile/*< / code > . All instrumentation hooks are macros
defined in < code class = "code" > include/profile/profiler.h< / code > .
2010-04-22 01:33:44 +02:00
< / p > < p > All the implementation of the instrumentation hooks is in
2009-10-05 20:04:44 +02:00
< code class = "code" > include/profile/impl/*< / code > . Although all the code gets included,
thus is publicly visible, only a small number of functions are called from
outside this directory. All calls to hook implementations must be
done through macros defined in < code class = "code" > profiler.h< / code > . The macro
2010-04-22 01:33:44 +02:00
must ensure (1) that the call is guarded against reentrance and
2009-10-05 20:04:44 +02:00
(2) that the call can be turned off at compile time using a
< code class = "code" > -D_GLIBCXX_PROFILE_...< / code > compiler option.
2010-01-05 21:51:05 +01:00
< / p > < / div > < div class = "sect2" title = "How To Add A Diagnostic" > < div class = "titlepage" > < div > < div > < h3 class = "title" > < a id = "manual.ext.profile_mode.developer.howto" > < / a > How To Add A Diagnostic< / h3 > < / div > < / div > < / div > < p > Let's say the diagnostic name is "magic".
2010-04-22 01:33:44 +02:00
< / p > < p > If you need to instrument a header not already under
2009-10-05 20:04:44 +02:00
< code class = "code" > include/profile/*< / code > , first edit the corresponding header
under < code class = "code" > include/std/< / code > and add a preprocessor directive such
as the one in < code class = "code" > include/std/vector< / code > :
< / p > < pre class = "programlisting" >
#ifdef _GLIBCXX_PROFILE
# include < profile/vector>
#endif
< / pre > < p >
< / p > < p > If the file you need to instrument is not yet under
< code class = "code" > include/profile/< / code > , make a copy of the one in
< code class = "code" > include/debug< / code > , or the main implementation.
You'll need to include the main implementation and inherit the classes
you want to instrument. Then define the methods you want to instrument,
define the instrumentation hooks and add calls to them.
Look at < code class = "code" > include/profile/vector< / code > for an example.
< / p > < p > Add macros for the instrumentation hooks in
< code class = "code" > include/profile/impl/profiler.h< / code > .
Hook names must start with < code class = "code" > __profcxx_< / code > .
Make sure they transform
in no code with < code class = "code" > -D_NO_GLBICXX_PROFILE_MAGIC< / code > .
2010-01-05 21:51:05 +01:00
Make sure all calls to any method in namespace < code class = "code" > __gnu_profile< / code >
2009-10-05 20:04:44 +02:00
is protected against reentrance using macro
2010-01-05 21:51:05 +01:00
< code class = "code" > _GLIBCXX_PROFILE_REENTRANCE_GUARD< / code > .
All names of methods in namespace < code class = "code" > __gnu_profile< / code > called from
2009-10-05 20:04:44 +02:00
< code class = "code" > profiler.h< / code > must start with < code class = "code" > __trace_magic_< / code > .
< / p > < p > Add the implementation of the diagnostic.
2010-01-05 21:51:05 +01:00
< / p > < div class = "itemizedlist" > < ul class = "itemizedlist" type = "disc" > < li class = "listitem" > < p >
2009-10-05 20:04:44 +02:00
Create new file < code class = "code" > include/profile/impl/profiler_magic.h< / code > .
2010-01-05 21:51:05 +01:00
< / p > < / li > < li class = "listitem" > < p >
2009-10-05 20:04:44 +02:00
Define class < code class = "code" > __magic_info: public __object_info_base< / code > .
This is the representation of a line in the object table.
The < code class = "code" > __merge< / code > method is used to aggregate information
across all dynamic instances created at the same call context.
The < code class = "code" > __magnitude< / code > must return the estimation of the benefit
as a number of small operations, e.g., number of words copied.
The < code class = "code" > __write< / code > method is used to produce the raw trace.
The < code class = "code" > __advice< / code > method is used to produce the advice string.
2010-01-05 21:51:05 +01:00
< / p > < / li > < li class = "listitem" > < p >
2009-10-05 20:04:44 +02:00
Define class < code class = "code" > __magic_stack_info: public __magic_info< / code > .
This defines the content of a line in the stack table.
2010-01-05 21:51:05 +01:00
< / p > < / li > < li class = "listitem" > < p >
2010-04-22 01:33:44 +02:00
Define class < code class = "code" > __trace_magic: public __trace_base< __magic_info,
2009-10-05 20:04:44 +02:00
__magic_stack_info> < / code > .
It defines the content of the trace associated with this diagnostic.
< / p > < / li > < / ul > < / div > < p >
< / p > < p > Add initialization and reporting calls in
< code class = "code" > include/profile/impl/profiler_trace.h< / code > . Use
< code class = "code" > __trace_vector_to_list< / code > as an example.
< / p > < p > Add documentation in file < code class = "code" > doc/xml/manual/profile_mode.xml< / code > .
2010-04-22 01:33:44 +02:00
< / p > < / div > < / div > < div class = "navfooter" > < hr / > < table width = "100%" summary = "Navigation footer" > < tr > < td width = "40%" align = "left" > < a accesskey = "p" href = "bk01pt03ch19s05.html" > Prev< / a > < / td > < td width = "20%" align = "center" > < a accesskey = "u" href = "profile_mode.html" > Up< / a > < / td > < td width = "40%" align = "right" > < a accesskey = "n" href = "bk01pt03ch19s07.html" > Next< / a > < / td > < / tr > < tr > < td width = "40%" align = "left" valign = "top" > Implementation Issues < / td > < td width = "20%" align = "center" > < a accesskey = "h" href = "../spine.html" > Home< / a > < / td > < td width = "40%" align = "right" valign = "top" > Diagnostics< / td > < / tr > < / table > < / div > < / body > < / html >