Browse Source

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

Thomas Markwalder 10 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
 an application process class derived from isc::d2::DProcess. These services include:
     - Command line argument handling
-    - Process instantiation and initialization0
+    - Process instantiation and initialization
     - Support for stand-alone execution
     - Support for integrated operation as a BUNDY module (session management
       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.
 
-    @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
     control operations such as configuration changes or status reporting will
     likely be implemented.
@@ -118,6 +114,90 @@ through the CPL layer:
 
 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
 
 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"
 
-
-
-
-
 */

+ 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
 /// 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
 /// 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
 /// one service, each service must have its own queue.
 ///
 /// 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
 /// instigating IOSignal from which the value of OS signal (i.e. SIGINT,
 /// 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
         ///
         /// @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
         ///