Browse Source

[3407] Updated D2 developer's guide for signal handling.

Thomas Markwalder 11 years ago
parent
commit
113fdc1f81

+ 85 - 9
src/bin/d2/d2.dox

@@ -52,7 +52,7 @@ base are shown in the following class diagram:
 - isc::d2::DControllerBase - provides all of the services necessary to manage
 - isc::d2::DControllerBase - provides all of the services necessary to manage
 an application process class derived from isc::d2::DProcess. These services include:
 an application process class derived from isc::d2::DProcess. These services include:
     - Command line argument handling
     - Command line argument handling
-    - Process instantiation and initialization0
+    - Process instantiation and initialization
     - Support for stand-alone execution
     - Support for stand-alone execution
     - Support for integrated operation as a BUNDY module (session management
     - Support for integrated operation as a BUNDY module (session management
       and event handling)
       and event handling)
@@ -84,10 +84,6 @@ an application process class derived from isc::d2::DProcess. These services incl
 
 
     The file may contain an arbitrary number of other modules.
     The file may contain an arbitrary number of other modules.
 
 
-    @todo DControllerBase will soon support dynamic reloading of the
-    configuration file upon receipt of the SIGHUP signal, and graceful
-    shutdown upon receipt of either SIGTERM or SIGINT.
-
     @todo Eventually, some sort of secure socket interface which supports remote
     @todo Eventually, some sort of secure socket interface which supports remote
     control operations such as configuration changes or status reporting will
     control operations such as configuration changes or status reporting will
     likely be implemented.
     likely be implemented.
@@ -118,6 +114,90 @@ through the CPL layer:
 
 
 The CPL classes will likely move into a common library.
 The CPL classes will likely move into a common library.
 
 
+@subsection cplSignals CPL Signal Handling
+
+CPL supports interaction with the outside world via OS signals. The default
+implementation supports the following signal driven behavior:
+- SIGHUP receipt of this signal will cause a reloading of the configuration
+file.
+- SIGINT/SIGTERM receipt of either of these signals will initiate an
+orderly shutdown.
+
+CPL applications wait for for process asynchronous IO events through
+isc::asiolink::IOService::run() or its variants.  These calls are not
+interrupted upon signal receipt as is the select() function and while
+boost::asio provides a signal mechanism it requires linking in additional
+libraries.  Therefore, CPL provides its own signal handling mechanism to
+propagate an OS signal such as SIGHUP to an IOSerivce as a ready event with a
+callback.
+
+isc::d2::DControllerBase uses two mechanisms to carry out signal handling.  It
+uses isc::util::SignalSet to catch OS signals, and isc::d2:IOSignalQueue to
+propagate them to its isc::asiolink::IOService as instances of
+isc::d2::IOSignal.
+
+This CPL signaling class hierarchy is illustrated in the following diagram:
+
+@image html cpl_signal_classes.svg "CPL Signal Classes"
+
+The mechanics of isc::d2::IOSignal are straight forward. Upon construction it
+is given the target isc::asiolink::IOService, the value of the OS signal to
+send (e.g. SIGINT, SIGHUP...), and an isc::d2::IOSignalHandler.  This handler
+should contain the logic the caller would normally execute in its OS signal
+handler. Each isc::d2::IOSignal instance has a unique identifier called its
+sequence_id.
+
+Internally, IOSignal creates a 1 ms, one-shot timer, on the given
+IOService.  When the timer expires its event handler invokes the caller's
+IOSignalHandler passing it the sequence_id of the IOSignal.
+
+Sending IOSignals is done through an isc::d2::IOSignalQueue.  This class is
+used to create the signals, house them until they are delivered, and dequeue
+them so they can be been handled.  To generate an IOSignal when an OS signal
+arrives, the process's OS signal handler need only call
+isc::d2::IOSignalQueue::pushSignal() with the appropriate values.
+
+To dequeue the IOSignal inside the caller's IOSignalHandler, one simply
+invokes isc::d2::IOSignalQueue::popSignal() passing it the sequence_id
+parameter passed to the handler.  This method returns a pointer to
+instigating IOSignal from which the value of OS signal (i.e. SIGINT,
+SIGUSR1...) can be obtained.  Note that calling popSignal() removes the
+IOSignalPtr from the queue, which should reduce its reference count to
+zero upon exiting the handler (unless a deliberate copy of it is made).
+
+A typical isc::d2::IOSignalHandler might be structured as follows:
+@code
+
+    void processSignal(IOSignalId sequence_id) {
+    // Pop the signal instance off the queue.
+    IOSignalPtr signal = io_signal_queue_->popSignal(sequence_id);
+
+    int os_signal_value = signal->getSignum();
+    :
+    // logic based on the signal value
+    :
+    }
+
+@endcode
+
+IOSignal's handler invocation code will catch, log ,and then swallow any
+exceptions thrown by an IOSignalHandler.  This is done to protect the integrity
+IOService context.
+
+CPL integrates the use of the two mechanisms by registering the method,
+isc::d2::DControllerBase::osSignalHandler(), as the
+isc::util::SignalSet::onreceipt_handler_.  This configures SignalSet's internal
+handler to invoke the method each time a signal arrives.  When invoked, this
+method will call isc::d2::IOSignalQueue::pushSignal() to create an
+isc::d2::IOSignal, passing in the OS signal received and
+isc::d2::DControllerBase::ioSignalHandler() to use as the IOSignal's
+ready event handler
+
+The following sequence diagram depicts the initialization of signal handling
+during startup and the subsequent receipt of a SIGHUP:
+
+@image html cpl_signal_sequence.svg "CPL Signal Handling Sequence"
+
 @section d2ProcesDerivation D2's CPL Derivations
 @section d2ProcesDerivation D2's CPL Derivations
 
 
 D2's core application classes are DDNS-specific derivations of the CPL as show
 D2's core application classes are DDNS-specific derivations of the CPL as show
@@ -380,8 +460,4 @@ when D2UpdateMgr creates and starts executing a transaction:
 
 
 @image html nc_trans_sequence.svg "Transaction Execution Sequence"
 @image html nc_trans_sequence.svg "Transaction Execution Sequence"
 
 
-
-
-
-
 */
 */

+ 393 - 0
src/bin/d2/images/cpl_signal_classes.svg

@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Bouml (http://bouml.free.fr/) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="804" height="836" version="1.1" xmlns="http://www.w3.org/2000/svg">
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="344" y="10" width="3" height="495" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="186" y="502" width="161" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="182" y="6" width="162" height="496" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="263" y="20">DControllerBase</text>
+	<line stroke="black" stroke-opacity="1" x1="182" y1="22" x2="344" y2="22" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="36">app_name_</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="50">bin_name_</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="64">verbose_</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="78">spec_file_name_</text>
+	<line stroke="black" stroke-opacity="1" x1="182" y1="80" x2="344" y2="80" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="94">DControllerBase()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="108">~DControllerBase()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="122">launch()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="136">updateConfig()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="150">configFromFile()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="164">executeCommand()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="178">getAppName()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="192">getBinName()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="206">customOption()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="186" y="220">createProcess()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="234">customControllerCommand()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="248">getUsageText()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="262">getCustomOpts()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="276">processSignal()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="290">isVerbose()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="304">setVerbose()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="318">getIOService()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="332">getSpecFileName()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="346">setSpecFileName()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="186" y="360">getController()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="186" y="374">setController()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="388">parseArgs()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="402">initProcess()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="416">runProcess()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="430">shutdownProcess()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="444">initSignalHandling()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="458">osSignalHandler()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="472">ioSignalHandler()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="486">getProcess()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="186" y="500">usage()</text>
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="737" y="207" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="667" y="251" width="73" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="663" y="203" width="74" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="700" y="217">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="700" y="233">IOSignalPtr</text>
+	<line stroke="black" stroke-opacity="1" x1="663" y1="235" x2="737" y2="235" />
+	<line stroke="black" stroke-opacity="1" x1="663" y1="243" x2="737" y2="243" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="467" y="353" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="371" y="397" width="99" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="367" y="349" width="100" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="417" y="363">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="417" y="379">IOSignalHandler</text>
+	<line stroke="black" stroke-opacity="1" x1="367" y1="381" x2="467" y2="381" />
+	<line stroke="black" stroke-opacity="1" x1="367" y1="389" x2="467" y2="389" />
+</g>
+	<rect fill="#c0ffff" stroke="none" stroke-opacity="1" x="323" y="800" width="268" height="25" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" x="323" y="812">Blue class integrate signal handling into D2</text>
+<g>
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="348" y1="278" x2="419" y2="278" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="419" y1="348" x2="425" y2="342" />
+	<line stroke="black" stroke-opacity="1" x1="419" y1="348" x2="413" y2="342" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="419" y1="278" x2="419" y2="348" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="751" y="309" width="3" height="103" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="653" y="409" width="101" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="649" y="305" width="102" height="104" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="700" y="319">IOSignal</text>
+	<line stroke="black" stroke-opacity="1" x1="649" y1="321" x2="751" y2="321" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="653" y="335">signum_</text>
+	<line stroke="black" stroke-opacity="1" x1="649" y1="337" x2="751" y2="337" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="653" y="351">IOSignal()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="653" y="365">~IOSignal()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="653" y="379">nextSequenceId()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="653" y="393">getSequenceId()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="653" y="407">getSignum()</text>
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="698" y1="304" x2="703" y2="297" />
+	<line stroke="black" stroke-opacity="1" x1="698" y1="304" x2="691" y2="298" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="697" y1="255" x2="698" y2="304" />
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="538" y="197">signals_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="100" y="444">signal_set_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="566" y="314">sequence_id_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="193" y="703">onreceipt_handler_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="454" y="27">io_signal_queue_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="599" y="729">io_service_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="433" y="729">io_service_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="549" y="424">sequence_id_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="429" y="419">handler_</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="724" y="539">timer_</text>
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="669" y="10" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="563" y="54" width="109" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="559" y="6" width="110" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="614" y="20">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="614" y="36">IOSignalQueuePtr</text>
+	<line stroke="black" stroke-opacity="1" x1="559" y1="38" x2="669" y2="38" />
+	<line stroke="black" stroke-opacity="1" x1="559" y1="46" x2="669" y2="46" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="558" y1="31" x2="552" y2="25" />
+	<line stroke="black" stroke-opacity="1" x1="558" y1="31" x2="552" y2="37" />
+	<line stroke="black" stroke-opacity="1" x1="348" y1="31" x2="558" y2="31" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="348,31 354,25 360,31 354,37" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="668" y="77" width="3" height="95" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="568" y="169" width="103" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="564" y="73" width="104" height="96" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="616" y="87">IOSignalQueue</text>
+	<line stroke="black" stroke-opacity="1" x1="564" y1="89" x2="668" y2="89" />
+	<line stroke="black" stroke-opacity="1" x1="564" y1="97" x2="668" y2="97" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="568" y="111">IOSignalQueue()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="568" y="125">~IOSignalQueue()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="568" y="139">pushSignal()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="568" y="153">popSignal()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="568" y="167">clear()</text>
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="618" y1="72" x2="624" y2="66" />
+	<line stroke="black" stroke-opacity="1" x1="618" y1="72" x2="612" y2="66" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="618" y1="58" x2="618" y2="72" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="168" y="532" width="3" height="285" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="24" y="814" width="147" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="20" y="528" width="148" height="286" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="94" y="542">SignalSet</text>
+	<line stroke="black" stroke-opacity="1" x1="20" y1="544" x2="168" y2="544" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="558">local_signals_</text>
+	<line stroke="black" stroke-opacity="1" x1="20" y1="560" x2="168" y2="560" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="574">SignalSet()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="588">SignalSet()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="602">SignalSet()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="616">~SignalSet()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="630">add()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="644">clear()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="658">getNext()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="672">handleNext()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="686">remove()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="24" y="700">setOnReceiptHandler()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="24" y="714">clearOnReceiptHandler()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="24" y="728">invokeOnReceiptHandler()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="742">block()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="756">erase()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="770">insert()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="784">maskSignals()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="798">popNext()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="24" y="812">unblock()</text>
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="566" y="206" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="490" y="250" width="79" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="486" y="202" width="80" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="526" y="216">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="526" y="232">IOSignalMap</text>
+	<line stroke="black" stroke-opacity="1" x1="486" y1="234" x2="566" y2="234" />
+	<line stroke="black" stroke-opacity="1" x1="486" y1="242" x2="566" y2="242" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="585" y="712" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="509" y="756" width="79" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="505" y="708" width="80" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="545" y="722">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="545" y="738">IOServicePtr</text>
+	<line stroke="black" stroke-opacity="1" x1="505" y1="740" x2="585" y2="740" />
+	<line stroke="black" stroke-opacity="1" x1="505" y1="748" x2="585" y2="748" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="563" y1="123" x2="528" y2="123" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="563,123 557,129 551,123 557,117" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="528" y1="201" x2="534" y2="195" />
+	<line stroke="black" stroke-opacity="1" x1="528" y1="201" x2="522" y2="195" />
+	<line stroke="black" stroke-opacity="1" x1="528" y1="123" x2="528" y2="201" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="662" y1="228" x2="656" y2="222" />
+	<line stroke="black" stroke-opacity="1" x1="662" y1="228" x2="656" y2="234" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="570" y1="228" x2="662" y2="228" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="672" y1="120" x2="783" y2="120" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="672,120 678,114 684,120 678,126" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="783" y1="120" x2="784" y2="733" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="589" y1="733" x2="595" y2="739" />
+	<line stroke="black" stroke-opacity="1" x1="589" y1="733" x2="595" y2="727" />
+	<line stroke="black" stroke-opacity="1" x1="784" y1="733" x2="589" y2="733" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="336" y1="506" x2="336" y2="734" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="336,506 342,512 336,518 330,512" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="504" y1="734" x2="498" y2="728" />
+	<line stroke="black" stroke-opacity="1" x1="504" y1="734" x2="498" y2="740" />
+	<line stroke="black" stroke-opacity="1" x1="336" y1="734" x2="504" y2="734" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="127" y="453" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="53" y="497" width="77" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="49" y="449" width="78" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="88" y="463">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="88" y="479">SignalSetPtr</text>
+	<line stroke="black" stroke-opacity="1" x1="49" y1="481" x2="127" y2="481" />
+	<line stroke="black" stroke-opacity="1" x1="49" y1="489" x2="127" y2="489" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="318" y="584" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="208" y="628" width="113" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="204" y="580" width="114" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="261" y="594">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="261" y="610">BoolSignalHandler</text>
+	<line stroke="black" stroke-opacity="1" x1="204" y1="612" x2="318" y2="612" />
+	<line stroke="black" stroke-opacity="1" x1="204" y1="620" x2="318" y2="620" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="574" y="358" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="504" y="402" width="73" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="500" y="354" width="74" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="537" y="368">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="537" y="384">IOSignalId</text>
+	<line stroke="black" stroke-opacity="1" x1="500" y1="386" x2="574" y2="386" />
+	<line stroke="black" stroke-opacity="1" x1="500" y1="394" x2="574" y2="394" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="90" y1="527" x2="96" y2="521" />
+	<line stroke="black" stroke-opacity="1" x1="90" y1="527" x2="84" y2="521" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="90" y1="501" x2="90" y2="527" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="263" y1="632" x2="257" y2="638" />
+	<line stroke="black" stroke-opacity="1" x1="263" y1="632" x2="269" y2="638" />
+	<line stroke="black" stroke-opacity="1" x1="263" y1="673" x2="263" y2="632" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="181" y1="401" x2="90" y2="401" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="181,401 175,407 169,401 175,395" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="172" y1="673" x2="263" y2="673" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="172,673 178,667 184,673 178,679" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="90" y1="448" x2="96" y2="442" />
+	<line stroke="black" stroke-opacity="1" x1="90" y1="448" x2="84" y2="442" />
+	<line stroke="black" stroke-opacity="1" x1="90" y1="401" x2="90" y2="448" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="648" y1="327" x2="560" y2="327" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="648,327 642,333 636,327 642,321" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="560" y1="353" x2="566" y2="347" />
+	<line stroke="black" stroke-opacity="1" x1="560" y1="353" x2="554" y2="347" />
+	<line stroke="black" stroke-opacity="1" x1="560" y1="327" x2="560" y2="353" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="499" y1="377" x2="493" y2="370" />
+	<line stroke="black" stroke-opacity="1" x1="499" y1="377" x2="492" y2="382" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="471" y1="376" x2="499" y2="377" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="267" y1="579" x2="273" y2="573" />
+	<line stroke="black" stroke-opacity="1" x1="267" y1="579" x2="261" y2="572" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="268" y1="506" x2="267" y2="579" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="531" y1="353" x2="536" y2="346" />
+	<line stroke="black" stroke-opacity="1" x1="531" y1="353" x2="524" y2="347" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="529" y1="254" x2="531" y2="353" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="588" y="551" width="3" height="123" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="500" y="671" width="91" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="496" y="547" width="92" height="124" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="542" y="561">IntervalTimer</text>
+	<line stroke="black" stroke-opacity="1" x1="496" y1="563" x2="588" y2="563" />
+	<line stroke="black" stroke-opacity="1" x1="496" y1="571" x2="588" y2="571" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="585">IntervalTimer()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="599">operator =()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="613">IntervalTimer()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="627">~IntervalTimer()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="641">setup()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="655">cancel()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="500" y="669">getInterval()</text>
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="546" y1="707" x2="551" y2="700" />
+	<line stroke="black" stroke-opacity="1" x1="546" y1="707" x2="539" y2="701" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="545" y1="675" x2="546" y2="707" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="585" y="463" width="3" height="53" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="497" y="513" width="91" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="493" y="459" width="92" height="54" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="539" y="473">TimerCallback</text>
+	<line stroke="black" stroke-opacity="1" x1="493" y1="475" x2="585" y2="475" />
+	<line stroke="black" stroke-opacity="1" x1="493" y1="483" x2="585" y2="483" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="497" y="497">TimerCallback()</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="497" y="511">operator ()()</text>
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="763" y="548" width="3" height="47" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="667" y="592" width="99" height="3" />
+	<rect fill="#c0ffff" stroke="black" stroke-width="1" stroke-opacity="1" x="663" y="544" width="100" height="48" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="713" y="558">&lt;&lt;typedef&gt;&gt;</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="713" y="574">IntervalTimerPtr</text>
+	<line stroke="black" stroke-opacity="1" x1="663" y1="576" x2="763" y2="576" />
+	<line stroke="black" stroke-opacity="1" x1="663" y1="584" x2="763" y2="584" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="671" y1="488" x2="671" y2="425" />
+<ellipse fill="none" stroke="black" stroke-width="1" stroke-opacity="1" cx="671" cy="419" rx="5" ry="5" />
+	<line stroke="black" stroke-opacity="1" x1="666" y1="419" x2="676" y2="419" />
+	<line stroke="black" stroke-opacity="1" x1="671" y1="414" x2="671" y2="424" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="589" y1="488" x2="671" y2="488" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="539" y1="406" x2="533" y2="412" />
+	<line stroke="black" stroke-opacity="1" x1="539" y1="406" x2="545" y2="411" />
+	<line stroke="black" stroke-opacity="1" x1="540" y1="458" x2="539" y2="406" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="540,458 533,452 539,446 545,451" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="492" y1="488" x2="419" y2="488" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="492,488 486,494 480,488 486,482" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="419" y1="401" x2="413" y2="407" />
+	<line stroke="black" stroke-opacity="1" x1="419" y1="401" x2="425" y2="407" />
+	<line stroke="black" stroke-opacity="1" x1="419" y1="488" x2="419" y2="401" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="541" y1="517" x2="535" y2="523" />
+	<line stroke="black" stroke-opacity="1" x1="541" y1="517" x2="547" y2="523" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="541" y1="546" x2="541" y2="517" />
+</g>
+<g>
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="714" y1="596" x2="714" y2="611" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="592" y1="611" x2="598" y2="617" />
+	<line stroke="black" stroke-opacity="1" x1="592" y1="611" x2="598" y2="605" />
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="714" y1="611" x2="592" y2="611" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="714" y1="543" x2="719" y2="536" />
+	<line stroke="black" stroke-opacity="1" x1="714" y1="543" x2="707" y2="537" />
+	<line stroke="black" stroke-opacity="1" x1="713" y1="413" x2="714" y2="543" />
+	<polygon fill="#000000" stroke="black" stroke-opacity="1" points="713,413 719,418 713,424 707,419" />
+</g>
+</svg>

+ 318 - 0
src/bin/d2/images/cpl_signal_sequence.svg

@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Bouml (http://bouml.free.fr/) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="848" height="803" version="1.1" xmlns="http://www.w3.org/2000/svg">
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="92" y1="45" x2="92" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="139" y="8" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="45" y="23" width="97" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="41" y="4" width="98" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="90" y="20">:DControllerBase</text>
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="384" y="74" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="296" y="89" width="91" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="292" y="70" width="92" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="338" y="86">:IOSignalQueue</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="340" y1="111" x2="340" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="469" y="101" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="411" y="116" width="61" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="407" y="97" width="62" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="438" y="113">:SignalSet</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="440" y1="138" x2="440" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="559" y="350" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="507" y="365" width="55" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="503" y="346" width="56" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="531" y="362">:IOSignal</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="533" y1="387" x2="533" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="662" y="373" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="586" y="388" width="79" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="582" y="369" width="80" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="622" y="385">:IntervalTimer</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="624" y1="410" x2="624" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="769" y="421" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="686" y="436" width="86" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="682" y="417" width="87" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="726" y="433">:TimerCallback</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="727" y1="458" x2="727" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="832" y="8" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="773" y="23" width="62" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="769" y="4" width="63" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="801" y="20">:IOService</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="802" y1="45" x2="802" y2="803" />
+</g>
+<g>
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="262" y="8" width="3" height="18" />
+	<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="176" y="23" width="89" height="3" />
+	<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="172" y="4" width="90" height="19" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" text-anchor="middle" x="217" y="20">:DProcessBase</text>
+</g>
+<g>
+	<line stroke="black" stroke-dasharray="18,6"  stroke-opacity="1" x1="219" y1="45" x2="219" y2="803" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="87" y="60" width="10" height="726" />
+</g>
+<g>
+	<polygon fill="#c0ffff" stroke="black" stroke-opacity="1" points="262,661 416,661 416,671 426,671 426,709 262,709 262,661" />
+	<line stroke="black" stroke-opacity="1" x1="416" y1="661" x2="426" y2="671" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="272" y="683">Details of configFromFile</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="272" y="695">omitted for clarity</text>
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="528" y="399" width="10" height="106" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="93" y="242" width="10" height="521" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="335" y="120" width="10" height="24" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="435" y="166" width="10" height="24" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="435" y="203" width="10" height="24" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="435" y="285" width="10" height="152" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="335" y="341" width="10" height="82" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="619" y="419" width="10" height="24" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="619" y="466" width="10" height="41" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="722" y="485" width="10" height="24" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="797" y="253" width="10" height="527" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="722" y="549" width="10" height="195" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="214" y="249" width="10" height="542" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="335" y="587" width="10" height="24" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="528" y="619" width="10" height="24" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="539" y1="471" x2="619" y2="471" />
+	<polygon fill="#000000" stroke="none" points="619,471 615,467 615,475" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="33" y1="66" x2="87" y2="66" />
+	<polygon fill="#000000" stroke="none" points="87,66 83,62 83,70" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="310" y1="290" x2="435" y2="290" />
+	<polygon fill="#000000" stroke="none" points="435,290 431,286 431,294" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="630" y1="492" x2="722" y2="492" />
+	<polygon fill="#000000" stroke="none" points="722,492 718,488 718,496" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="733" y1="554" x2="797" y2="554" />
+	<polygon fill="#000000" stroke="none" points="733,554 737,550 737,558" />
+</g>
+<g>
+	<polygon fill="#c0ffff" stroke="black" stroke-opacity="1" points="29,288 173,288 173,298 183,298 183,348 29,348 29,288" />
+	<line stroke="black" stroke-opacity="1" x1="173" y1="288" x2="183" y2="298" />
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="39" y="310">Sometime after</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="39" y="322">runProcess is called</text>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="39" y="334">SIGHUP is sent</text>
+</g>
+<ellipse fill="black" stroke="none" cx="28.5" cy="67.5" rx="4.5" ry="4.5" />
+<ellipse fill="black" stroke="none" cx="305.5" cy="291.5" rx="4.5" ry="4.5" />
+<g>
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="183" y1="306" x2="300" y2="291" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="93" y="98" width="10" height="122" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="99" y="562" width="10" height="195" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="441" y="313" width="10" height="116" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="220" y="722" width="10" height="24" />
+</g>
+<g>
+	<path fill="none" stroke="black" stroke-opacity="1" d="M 105 99 L 122 99 L 122 106 L 105 106" />
+	<polygon fill="#000000" stroke="none" points="105,106 109,110 109,102" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="104" y1="134" x2="335" y2="134" />
+	<polygon fill="#000000" stroke="none" points="335,134 331,130 331,138" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="104" y1="178" x2="435" y2="178" />
+	<polygon fill="#000000" stroke="none" points="435,178 431,174 431,182" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="104" y1="208" x2="435" y2="208" />
+	<polygon fill="#000000" stroke="none" points="435,208 431,204 431,212" />
+</g>
+<g>
+	<path fill="none" stroke="black" stroke-opacity="1" d="M 453 314 L 470 314 L 470 321 L 453 321" />
+	<polygon fill="#000000" stroke="none" points="453,321 457,325 457,317" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="346" y1="351" x2="441" y2="351" />
+	<polygon fill="#000000" stroke="none" points="346,351 350,347 350,355" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="110" y1="567" x2="722" y2="567" />
+	<polygon fill="#000000" stroke="none" points="110,567 114,563 114,571" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="110" y1="592" x2="335" y2="592" />
+	<polygon fill="#000000" stroke="none" points="335,592 331,588 331,596" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="110" y1="624" x2="528" y2="624" />
+	<polygon fill="#000000" stroke="none" points="528,624 524,620 524,628" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="105" y="652" width="10" height="100" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="346" y1="404" x2="528" y2="404" />
+	<polygon fill="#000000" stroke="none" points="528,404 524,400 524,408" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="539" y1="431" x2="619" y2="431" />
+	<polygon fill="#000000" stroke="none" points="619,431 615,427 615,435" />
+</g>
+<g>
+	<path fill="none" stroke="black" stroke-opacity="1" d="M 117 653 L 134 653 L 134 660 L 117 660" />
+	<polygon fill="#000000" stroke="none" points="117,660 121,664 121,656" />
+</g>
+<g>
+	<rect fill="#ffffff" stroke="black" stroke-width="1" stroke-opacity="1" x="111" y="686" width="10" height="61" />
+</g>
+<g>
+	<path fill="none" stroke="black" stroke-opacity="1" d="M 123 687 L 140 687 L 140 694 L 123 694" />
+	<polygon fill="#000000" stroke="none" points="123,694 127,698 127,690" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="122" y1="727" x2="220" y2="727" />
+	<polygon fill="#000000" stroke="none" points="220,727 216,723 216,731" />
+</g>
+<g>
+	<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="261" y1="687" x2="141" y2="691" />
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="38" y="61">launch()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="106" y="91">initSignalHandling()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="113" y="121">IOSignalQueue(io_service)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="116" y="161">setOnReceiptHandler(DControllerBase::osSignalHandler)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="140" y="202">SignalSet(SIGHUP,SIGINT,SIGTERM)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="288" y="279">internalHandler(SIGHUP)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="359" y="309">invokeOnReceiptHandler(SIGHUP)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="314" y="340">pushSignal(SIGHUP, DControllerBase::ioSignalHandler)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="353" y="399">IOSignal(io_service, SIGHUP, handler)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="548" y="418">IntervalTimer(io_service)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="431" y="459">setup(TimerCallBack(sequence_id, handler), 1, ONE_SHOT))</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="637" y="478">TimerCallback(sequence_id, handler)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="737" y="547">operator ()()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="722" y="256">run()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="118" y="240">runProcess()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="146" y="254">run()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="128" y="562">ioSignalHandler(sequence_id)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="191" y="587">popSignal()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="448" y="615">getSignum()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="117" y="647">processSignal(SIGHUP)</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="126" y="682">configFromFile()</text>
+</g>
+<g>
+	<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="142" y="722">configure()</text>
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="225" y1="260" x2="797" y2="260" />
+	<polygon fill="#000000" stroke="none" points="797,260 793,256 793,264" />
+</g>
+<g>
+	<path fill="none" stroke="black" stroke-opacity="1" d="M 105 243 L 122 243 L 122 250 L 105 250" />
+	<polygon fill="#000000" stroke="none" points="105,250 109,254 109,246" />
+</g>
+<g>
+	<line stroke="black" stroke-opacity="1" x1="104" y1="259" x2="214" y2="259" />
+	<polygon fill="#000000" stroke="none" points="214,259 210,255 210,263" />
+</g>
+</svg>

+ 3 - 3
src/bin/d2/io_service_signal.h

@@ -62,14 +62,14 @@ typedef boost::function<void(IOSignalId sequence_id)> IOSignalHandler;
 /// arrives, the process's OS signal handler simply calls @ref
 /// arrives, the process's OS signal handler simply calls @ref
 /// isc::d2::IOSignalQueue::pushSignal() with the appropriate values.
 /// isc::d2::IOSignalQueue::pushSignal() with the appropriate values.
 ///
 ///
-/// @Note that an IOSignalQueue requires a non-null IOServicePtr to construct.
+/// @note that an IOSignalQueue requires a non-null IOServicePtr to construct.
 /// This ensures that the IOService cannot be destroyed before any pending
 /// This ensures that the IOService cannot be destroyed before any pending
 /// signals can be canceled.  It also means that a queue can only be used to
 /// signals can be canceled.  It also means that a queue can only be used to
 /// send signals to that IOService.  If you need to send signals to more than
 /// send signals to that IOService.  If you need to send signals to more than
 /// one service, each service must have its own queue.
 /// one service, each service must have its own queue.
 ///
 ///
 /// To dequeue the IOSignal inside the caller's IOSignalHandler, one simply
 /// To dequeue the IOSignal inside the caller's IOSignalHandler, one simply
-/// invokes @ref isc::d2::IOSignalQueue:popSignal() passing it the sequence_id
+/// invokes @ref isc::d2::IOSignalQueue::popSignal() passing it the sequence_id
 /// parameter passed to the handler.  This method returns a pointer to
 /// parameter passed to the handler.  This method returns a pointer to
 /// instigating IOSignal from which the value of OS signal (i.e. SIGINT,
 /// instigating IOSignal from which the value of OS signal (i.e. SIGINT,
 /// SIGUSR1...) can be obtained.  Note that calling popSignal() removes the
 /// SIGUSR1...) can be obtained.  Note that calling popSignal() removes the
@@ -151,7 +151,7 @@ public:
         /// @param handler pointer to the function to handle the IOSignal
         /// @param handler pointer to the function to handle the IOSignal
         ///
         ///
         /// @throw IOSignalError if handler is null.
         /// @throw IOSignalError if handler is null.
-        TimerCallback(IOSignalId sequence_id_, IOSignalHandler handler_);
+        TimerCallback(IOSignalId sequence_id, IOSignalHandler handler);
 
 
         /// @brief () Operator which serves as the timer's callback
         /// @brief () Operator which serves as the timer's callback
         ///
         ///