From 2e76289006deffaa0b8482f52c5bbb4e5a7ce9b0 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Thu, 6 Mar 2008 18:55:21 +0000 Subject: [PATCH] [220446] Updated the "DSF Common Patterns" document. --- .../docs/common/data_model_1.dia | Bin 0 -> 1382 bytes .../docs/common/data_model_1.png | Bin 0 -> 4299 bytes .../docs/common/data_model_2.dia | Bin 0 -> 1740 bytes .../docs/common/data_model_2.png | Bin 0 -> 6953 bytes .../docs/common/dsf_common_patterns.html | 793 +++++++++++++++++- .../docs/common/request_monitor_1.dia | Bin 0 -> 2088 bytes .../docs/common/request_monitor_1.png | Bin 0 -> 13914 bytes .../docs/common/timers_1.png | Bin 0 -> 9451 bytes 8 files changed, 768 insertions(+), 25 deletions(-) create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/data_model_1.dia create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/data_model_1.png create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/data_model_2.dia create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/data_model_2.png create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/request_monitor_1.dia create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/request_monitor_1.png create mode 100644 plugins/org.eclipse.dd.doc.dsf/docs/common/timers_1.png diff --git a/plugins/org.eclipse.dd.doc.dsf/docs/common/data_model_1.dia b/plugins/org.eclipse.dd.doc.dsf/docs/common/data_model_1.dia new file mode 100644 index 0000000000000000000000000000000000000000..8dbabe73f156d5a14eef900e42ec956a3567e8df GIT binary patch literal 1382 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 H$1nZ`msD$l literal 0 HcmV?d00001 diff --git a/plugins/org.eclipse.dd.doc.dsf/docs/common/dsf_common_patterns.html b/plugins/org.eclipse.dd.doc.dsf/docs/common/dsf_common_patterns.html index 79f481f79fb..0fd59f1a441 100644 --- a/plugins/org.eclipse.dd.doc.dsf/docs/common/dsf_common_patterns.html +++ b/plugins/org.eclipse.dd.doc.dsf/docs/common/dsf_common_patterns.html @@ -96,7 +96,7 @@ Following is the snippet from a the "hello world" example of using a request monitor:
- @@ -172,7 +172,7 @@ value to the caller.  DataRequestMonitor can be used for that purpose. A simple example of using the data request monitor:

-
@@ -226,7 +226,7 @@ The following snipped from the AsyncQuicksort example shows a simple example of using the CountingRequestMonitor:

-
@@ -280,7 +280,7 @@ execution paths!
Excercise 2: Converting a -synchronous method into an asynchronous one, is another common task in +synchronous method into an asynchronous one is another common task in DSF.  This excercise converts the AsyncQuicksort.partition() method into asynchronous AsyncQuicksort.asyncPartition(). 

Look @@ -301,7 +301,7 @@ viewer and an asynchronous data generator.
data access methods:

- @@ -355,7 +355,7 @@ following snippet from SyncDataViewer.getElements()  shows the use of Query:

-
@@ -407,7 +407,8 @@ an executor. 
java.util.concurrent.Future.get() method, implemented by Query, until the request monitor from the execute() method is completed. -
+
Image 1: Sequence diagram of Query use in -getElements().
+ style="font-weight: bold;">Image 1: Detailed sequence of calling +IDataGenerator.getCount() in SyncDataViewer.getElements().
-
-

-
-

TODO -?: add a sequence diagram of the deadlock scenario
-

Synchronization

Managing race conditions and deadlocks is one of the most challanging @@ -455,7 +450,7 @@ to the executor thread.  The following is an example of this from the DataGeneratorWithExecutor:

- @@ -503,7 +498,8 @@ left out.
- +
@@ -535,7 +531,7 @@ thread-based implementation this loop is implemented in the run method of the generator's thread:

-

Image 1: Synchronization using multiple + style="font-weight: bold;">Image 2: Synchronization using multiple locks on data.
Image 2: Synchronization using a single + style="font-weight: bold;">Image 3: Synchronization using a single DSF executor thread.
@@ -592,7 +588,7 @@ servicing the queue, which is called by every method that adds a new request to the queue:

-
@@ -780,17 +776,764 @@ module.

+

Timers Example

+The Timers example, found in the org.eclipse.dd.examples.dsf.timers +package, is used as a reference throughout the following +sections.  It is useful to get familiar with this example at this +time.
+

Timer example defines the following two services:
+

+
    +
  • TimerService - +This service manages a set of timers where each timer's value is +incremented every second.  The timer service contains the +following features:
    +
  • +
      +
    • startTimer() method - +Allows user to create a new timer.  It returns the Data Model +context for the new timer.
      +
    • +
    • killTimer() method - +Allows the user to delete the given timer.  It requires a timer +context.
      +
    • +
    • getTimers() method - +Returns the array of contexts for existing timers.
      +
    • +
    • getTimerValue() method +- Returns the current value for the given timer context.
      +
    • +
    • TimerTickEvent event +class - An event that is generated for every timer, every time its +value changes (once per second).  The event contains the timer's +context.
      +
    • +
    +
  • AlarmService - +This service manages a set of triggers and alarms.  Triggers can +be created and destroyed independently.  Alarms represent a timer +and a trigger combined.  The Alarm service has the following +features:
  • +
      +
    • createTrigger() method +- Creates a new trigger with a given value.  It returns a context +to the new trigger.
      +
    • +
    • deleteTrigger() method +- Deletes the trigger for the given context.
      +
    • +
    • setTriggerValue() +method - Sets the value of a trigger to the given value.
      +
    • +
    • getAlarm() method - +Gets the alarm for the specified timer and trigger contexts.  It +returns an alarm context object.
      +
    • +
    • AlarmTriggeredDMEvent +event class - An event that is generated for every timer that trips the +given trigger by surpassing its value.  The event contains an +alarm context.
      +
    • +
    +
+The Timers example also features a user interface for displaying and +manipulating the data in the example's services.  The principal +component of this UI is a view that can be opened by following the +menus: Window->Show View->Other, +then selecting DSF +Examples->Timers View in the selection dialog.  This +view contains a tree viewer which displays the timers, triggers, and +alarms in a hierarchy.  The alarms are only shown when triggered +and are automatically selected upon a triggered event.
+ + + + + + + + + +

+
Image 4: Screen shot of the Timers view.
+
+Other features of the Timers example UI include:
+
    +
  • New Timer action +- Adds a new timer, which immediately shows up in the view.
  • +
  • New Trigger action +- Opens a dialog where the user enters the value of the new +trigger.  Upon OK, the dialog creates a new trigger that is added +to the view.
  • +
  • Remove action - +Removes a timer or a trigger, whichever is currently selected in the +viewer.
    +
  • +
  • Toggle Layout action +- Switches the hierarchy in the tree to either Timers->Triggers->Alarm or Triggers->Timers->Alarm
  • +
  • Edit Trigger Value cell +editor - changes the value of the selected trigger.
    +
  • +

Services

OSGi

+DSF builds on top of OSGi services APIs.   OSGi offers a rich +API for managing services and it is important to understand some of the +OSGi service API basics in order to use DSF
+
    +
  • Registration - +Services need to register and unregister themselves with OSGi framework
  • +
      +
    • BundleContext.registerService() +- registers a service, it returns a ServiceRegistration object which +should be retained by the caller.
    • +
    • ServiceRegistration.unregister() +- unregisters a service.
    • +
    +
  • References - +Clients wishing to use a service, need to obtain a reference to the +service.  OSGi features reference counting for services.
  • +
      +
    • BundleContext.getServiceReference(), +BundleContext.getServiceReferences(), +BundleContext.getAllServiceReferences() - methods for retrieving a +reference to a service using a class name and/or a property filter.
    • +
    • BundleContext.ungetService() - Releases a service reference and +decrements its use count.
    • +
    +
  • Events - Clients +using services should listen to service events.  Events are issued +when services are added/removed/modified.
  • +
      +
    • org.osgi.framework.ServiceListener - interface for a service +listener.  Objects implementing this interface can be registered +with the BundleContext
    • +
    +
+
+ + + + + + +
Note: The service APIs all use the +BundleContext and they require the BundleContext to be active.  +This means DSF-based debugger integrations initialize after the plugin +is started, but  that they also shut down before the plugin is +stopped.  The first part is not difficult, but the second part +usually requires that the plugin's BundleActivator.stop() method shuts +down the debugger.
+
+

Session

+DSF-based debugger integrations can register many services and there +can be multiple instances of debuggers registering services with the +same interfaces.  To help coordinate services in a give debugger +instance and distinguish the services between the instances of +debuggers, DSF services are organized into sessions.
+

DSF Session features include:
+

+
    +
  • Unique Session ID +- This ID is used to distinguish services from different +sessions.  Clients may also obtain a session instance using an ID +through a static method.
    +
  • +
  • Session Lifecycle Events - Clients may register to listen when +sessions are started and ended.
    +
  • +
  • DSF Executor - +Eash session has a (single-threaded) DSF Executor  associated with +it, though multiple sessions could share a single executor.  More +about session executor in the next section.
  • +
  • Service Events - +The session is used to dispatch service events.  More on events in +following sections.
  • +
  • Model Adapters - +A session allws an adapter to be registered, which will be returned by +all Data Model contexts in a given session for a given adapter +type.  More information about Data Model is described in the Data +Model section.
    +
  • +
+

Executor

+All the services registered with the same session share a single DSF +Executor.  By convention, all public service interfaces should be +restricted to being called in this executor thread.  This point +goes back to the primary synchronization mechanism of DSF.  +Following this rule greatly simplifies the task of protecting the +integrity of service state information.
+
+ + + + + + +
Note: All service public methods +should be called using the session's DSF executor.
+

Tracker

+Using the OSGi APIs for accessing services directly can be very +cumbersome.  A client retrieving a service reference is +responsible for retaining the ServiceReference object and for calling +BundleContext.ungetService() to avoid leaking the refernce.  Also, +since a service may be un-registered at any time, the clients need to +listen for events indicating when a service is unregistered.  +Fortunately there are two utilities which help with this task
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
org.osgi.util.tracker.ServiceTracker
+
org.eclipse.dd.dsf.service.DsfServicesTracker
+
Services +tracked
+
Tracks all services with a given +class name or filter. 
+
Tracks all services within a +given DSF session. 
+
Thread +safetyThread safeRestricted to the session +executor thread.
Accessor +methods
+
+
    +
  • getService() - +return the first service instance matching the class/filter
  • +
  • getServices() - +returns all references matching the specified class/filter.
  • +
+
    +
+
+
    +
  • getService(Class) +- Returns the first service instance matching given class
  • +
  • getService(Class, String) +- Returns the first service instance matching given class and filter.
    +
  • +
+
Activation/Disposal +methods
+
+
    +
  • open() - Starts +tracking maching services.
  • +
  • close() - Shuts +down and un-gets all service references.
  • +
+
+
    +
  • <constructor> +- DSF services tracker can be used immediately after being constucted.
  • +
  • dispose() - +Disposes and un-gets all service references held by the tracker.
    +
  • +
+
+ + + + + + +
Note: All service trackers must be +disposed (or closed).  Failing to dispose a tracker results in a +service reference leak.
+
+

Initialization / Shutdown

+Every DSF service must +implement the IDsfService.initialize() and IDsfService.shutdown() +methods.  These methods can only be called in the session executor +thread  and are asynchronous.  As the last step in +initialization, a service should register itself.  Likewise as the +first step of shut-down a service should unregister itself.  Also +during initialization, each service should call +DsfSession.getAndIncrementServiceStartupCounter(), in order to obtain +the startup number of the service.  This number is used in +prioritizing the service events.
+

Starting up a large number of DSF services requires calling a number +of asynchronous method in a pre-defined sequence.  Implementing +this startup code can be cumbersome and DSF provides a quitility for +implementing it: org.eclipse.dd.dsf.concurrent.Sequence. 
+

+

Here's +an example of how the Sequence is extended to perform the task of +shutting down the services in the +Timers example:
+

+
+ + + + + + + + + + +
org.eclipse.dd.examples.dsf.timers.ServicesStartupSequence
+

+
+
 25: public class ServicesShutdownSequence extends Sequence {

27: // Session to that the services are running in.
28: final private DsfSession fSession;
29:
30: // DSF Services is created as the first step of the sequence. It
31: // cannot be created by the constructor because it can only be called
32: // in the session thread.
33: DsfServicesTracker fTracker;

35: public ServicesShutdownSequence(DsfSession session) {
36: super(session.getExecutor());
37: fSession = session;
38: }
39:
40: Step[] fSteps = new Step[] {
41: new Step() {
42: @Override
43: public void execute(RequestMonitor requestMonitor) {
44: fTracker = new DsfServicesTracker(DsfExamplesPlugin.getBundleContext(), fSession.getId());
45: requestMonitor.done();
46: }
47:
48: @Override
49: public void rollBack(RequestMonitor requestMonitor) {
50: // Dispose the tracker in case shutdown sequence is aborted
51: // and is rolled back.
52: fTracker.dispose();
53: fTracker = null;
54: requestMonitor.done();
55: }
56: },
57: new Step() {
58: @Override
59: public void execute(RequestMonitor requestMonitor) {
60: shutdownService(AlarmService.class, requestMonitor);
61: }
62: },
63: new Step() {
64: @Override
65: public void execute(RequestMonitor requestMonitor) {
66: shutdownService(TimerService.class, requestMonitor);
67: }
68: },
69: new Step() {
70: @Override
71: public void execute(RequestMonitor requestMonitor) {
72: // Dispose the tracker after the services are shut down.
73: fTracker.dispose();
74: fTracker = null;
75: requestMonitor.done();
76: }
77: }
78: };
79:
80: @Override
81: public Step[] getSteps() { return fSteps; }

83: // A convenience method that shuts down given service. Only service class
84: // is used to identify the service.
85: private <V extends IDsfService> void shutdownService(Class<V> clazz, RequestMonitor requestMonitor) {
86: IDsfService service = fTracker.getService(clazz);
87: if (service != null) {
88: service.shutdown(requestMonitor);
89: }
90: else {
91: requestMonitor.setStatus(new Status(
92: IStatus.ERROR, DsfExamplesPlugin.PLUGIN_ID,
93: IDsfService.INTERNAL_ERROR,
94: "Service '" + clazz.getName() + "' not found.", null));
95: requestMonitor.done();
96: }
97: }
99: }
+
+
+
    +
  • Line 40 initializes an array of Step objects which are invoked by +the Sequence logic.  Each Step class is an inner class with access +to
    +shared data in the ServicesShutdownSequence class.
  • +
  • Line 81 implements the protected method used by the Sequence +class to access the steps.
  • +
  • Line 85 encapsulates the repetitive logic of finding and shutting +down a given service.
  • +
  • Line 73 disposes the DsfServicesTracker used by the sequence.
  • +
+

+Below is the code snipped that invokes the ServicesShutdownSequence in +the Timers example:
+

+
+ + + + + + + + + + +
org.eclipse.dd.examples.dsf.timers.TimersView
+

+
+
181:             ServicesShutdownSequence shutdownSeq = 
182: new ServicesShutdownSequence(fSession);
183: fSession.getExecutor().execute(shutdownSeq);
184: try {
185: shutdownSeq.get();
186: } catch (InterruptedException e) { assert false;
187: } catch (ExecutionException e) { assert false;
188: }
+
+
+
    +
  • Line 183 submits the sequence to the session executor. 
    +
  • +
  • Line 185 calls the Future.get() method of the sequence to block +the calling thread until the sequence completes.
  • +
+ + + + + + +
Note: Sequence implements the +java.util.concurrent.Future interface just like the DSF Query +object.  However, if the sequence needs to be invoked from the +executor thread, the Future.get() method cannot be used (or a deadlock +would occur).  Instead the sequence should be constructed with a +custom request monitor to be invoked at the completion of the sequence.
+
+
+

Events

+DSF provides a somewhat unusual event mechanism, where event listeners +do not implement any particular listener interface.  Instead, +event listeners use the DsfServiceEventHandler +annotation to identify listener methods.  DSF finds the annotated +listener methods using reflection. 
+

To generate an event a service must:
+

+
    +
  1. Call DsfSession.dispatchEvent(Object +event, Dictionary<String, String> serviceProperties) +method.  The second parameter allows service listeners to filter +events using specific service properties.
  2. +
+In order to receive DSF events a client must:
+
    +
  1. Declare a public event +listener method (method name is not important), which takes an event parameter. The type of the +event parameter depends on the event, where the listener will receive +all service events which can be cast to the declared type.  A +second optional parameter of type Dictionary<String, +String> allows the event listener to examine the properties +of the service that is sending the event.
  2. +
  3. Add itself as a service event listener by calling DsfSession.addServiceEventListener().
  4. +
+ + + + + + +
Note: DsfSession.dispatchEvent() +calls event listeners in a separate Runnable submitted to the session +executor.  This is significant because the event listeners may +call other service methods changing the overall state of the +system.  It also implies that the event listeners are always +called in the session executor thread.
+
+
+ + + + + + +
Note: Service events are +prioritized.  Listeners which themselves are services are called +first, in the order that they were initialized.  All other +listenres are called after the services.
+

Data Model

-

View Model

-

Adapter, Provider, Node

-

Timers

+The term Data Model refers to +the natural structure of data that is being retrieved by the DSF +services.  One of the great challanges of creating an user +interface for a debugger is that the amount of of data that is +available on the target is much greater than what can be practially +presented to the user.  Therefere the debugger services need to +break up the data into chunks with appropriate granularity to achieve +maximum performance and usability.
+

IDMContext

+The IDMContext represents a handle to a chunk of data in the Data +Model.  This interface is a minimal, yet central feature of the +Data Model API.
+

What a Data Model context is:
+

+
    +
  • It is hierarchical.  +Contexts can have other contexts as parents.  The hierarchy of +contexts in a given system roughly defines that system's overall Data +Model.  More on context hierarchy
    +
  • +
  • It extends the org.eclipse.core.runtime.IAdaptable interface.  This +allows decorators, retargetable actions, etc. to be associated with a +context.
  • +
  • It is associated with a +single DSF session.  The IDMContext.getSessionID() returns +the session ID of the given context.  This allows all clients to +get a handle on the session and the executor needed to access the DSF +services that the context originated from.
    +
  • +
  • It is thread safe. +This allows context objects to be stored and compared in viewers, +caches, and other clients which may implement their own threading model.
    +
  • +
  • It is light-weight and +preferably immutable. This allows contexts to be stored by +clients that may persist beyond the life of the services that +originated them.  If a context holds references to a lot of data +or it may prevent that data from being garbage collected.
  • +
+What a Data Model context is NOT:
+
    +
  • It is NOT a reference +to a service.  Context should not return a reference to a +service directly because clients should use the appropriate OSGi APIs +to obtain references to DSF services. 
    +
  • +
  • It is NOT persistable.  +Since a context returns a context ID, it is valid only for the life of +a single DSF session. 
  • +
+
+ + + + + + +
Note: An IDMContext object can be +used to retrieve any +type of data object from the service.  Although there is an +IDMData marker interface defined, its presence it historical and its +use is optional.
+
+

Context Hierarchy

+One of the most powerful features of the IDMContext interface is that +is is hierarchical.  The IDMContext.getParents() +method returns the immediate ancestors of a given context and following +the parents' parents allows clients to traverse the full hierarchy of a +context. 
+

The use of the context hierarchy may be best explained with use of +the Timers example.  In the timers example there are three +contexts that are used:
+

+
    +
+
    +
  1. Timer - no +parent contexts
    +
  2. +
  3. Trigger - no +parent contexts
    +
  4. +
  5. Alarm - requires +both a timer and a trigger as parent contexts
  6. +
+
    +
+From these, only the third one has any parents (and any hierarchy), the +code snippet below shows how these parents are used in the AlarmService:

- + + + + + + + + + +
org.eclipse.dd.examples.dsf.timers.AlarmService.isAlarmTriggered()
+

+
+
209:     public boolean isAlarmTriggered(AlarmDMContext alarmCtx) {
210: // Extract the timer and trigger contexts. They should always be part
211: // of the alarm.
212: TimerService.TimerDMContext timerCtx = DMContexts.getAncestorOfType(
213: alarmCtx, TimerService.TimerDMContext.class);
214: TriggerDMContext triggerCtx = DMContexts.getAncestorOfType(
215: alarmCtx, TriggerDMContext.class);

217: assert triggerCtx != null && timerCtx != null;

219: // Find the trigger and check whether the timers value has surpassed it.
220: if (fTriggers.containsKey(triggerCtx)) {
221: int timerValue = getServicesTracker().getService(TimerService.class).
222: getTimerValue(timerCtx);
223:
224: return timerValue >= fTriggers.get(triggerCtx);
225: }
226:
227: return false;
228: }
+
+
+
    +
  • Lines 212 and 214 search the context hierarchy of the alarm +context for the timer and trigger contexts. 
    +
  • +
+ + + + + + +
Note: Methods that take a context +as an argument can specify the generic IDMContext as the argument type, +then search this context for a specific context type.  The benefit +of this technique is increased flexibility, at the cost of compile-time +type checking, and it is used throughout DSF to avoid dependencies +between service interfaces.
+
+

DMContexts

+Searching the context hierarchy can be tedious to implement, the +DMContexts utility class contains a few static methods to simplify this +task:
+
    +
  • getAncestorOfType() +- Searches for a context of a specific type in the hierarchy of the +given context.
  • +
  • isAncestorOf() - +Checks whether the one of the argument contexts is in the hierarchy of +the other.
  • +
  • toList() - +Converts all the contexts in a hierarchy of the give context into a +list.
  • +
+

View Model

+View Model refers to the ideal user-presentable +structure of the data.  This is in contrast to the Data Model, +which refers to the natural +data structure, although the two often end up being the same.  +Never the less, the needs of the user presentation often change so the +central feature of the View Model is the ability to customize it.
+

Flexible Hierarchy

+View Model builds on the flexible +hierarchy API introduced by Debug +Platform team in release 3.2.  The flexible hierarchy API has a +few distinguishing features:
+
    +
  1. There are provider interfaces for every aspect of data +presentation in the viewer (content, label, columns, etc.). 
    +
  2. +
  3. The provider interfaces are retrieved by the viewer for each element in the +viewer.  This allows the +view content to be populated from multiple sources.
  4. +
  5. Provider interfaces are asynchronous. 
    +
  6. +
+ + + + + + +
Note: Flexible Hierarchy is still +a provisional API in Eclipse Platform 3.4.  This virtually +guarantees that DSF will break backward API compatibility in future +releases.  However, these APIs have now been widely used by open +source projects such as DD and CDT and also by many commercial Eclipse +integrations, so the API changes are likely to be small and mostly +related to packaging.
+
+

Adapter Problem
+

+The number two feature of flexible hierarchy API is implemented using +the adapter pattern.  One down-side of the adapter pattern is that +there can only be one instance of an adapter of a particular type +registered for a given element.  For flexible hierarchy providers, +it means that each provider must implement the element presentation +logic for every view that the element appears in, and as a result +adding a new view can force changing a large number of modules.
+

TODO: add a diagram of the +adapter pattern used by multiple views.
+

+

To overcome the adapter pattern limitation, the View Model uses +wrapper objects.  The wrapper objects are held by the viewer and +they redirect the requests for different flexible hierarchy providers +to the appropriate modules.
+

+

TODO: add a diagram of the View +Model hierarchy adapter pattern use
+

+

IVMAdapter -> IVMProvider -> IVMNode -> IVMContext

+
+
+
+
+
+ diff --git a/plugins/org.eclipse.dd.doc.dsf/docs/common/request_monitor_1.dia b/plugins/org.eclipse.dd.doc.dsf/docs/common/request_monitor_1.dia new file mode 100644 index 0000000000000000000000000000000000000000..c2bd2b8b805fc8b53d42e9c117d0a00fc4f40ee2 GIT binary patch literal 2088 zcmV+@2-o)?iwFP!000001MOW~Z`(E$e$THk+?NeVX_C6PO^R;VumLRwY%TU^&=O;7 zl_gJ-}hM z;9>acDf=3ZifTp&^&F{tL8f#PQ}R_@HDq6o)1>MJjmy=}7g6G~BI$ZjDI%zc|J*B6 zluB5kaQgV_gZ?USQgLBdS6xGeM$$Qnr+!$q!}=!3I|2h6W6V0kaBK%!x`j4&V?O9D2;j=9ysizh!#qZ93aB0+MF z1Nr6cY`b*kPGjFYK5-992x?jRUOF4U9P2I!u+hB7asz952A=)Ip9Hkd2R}@63wrzN z*WFZKenuIF?{057Ci2>Zi-c!WgBq7F64Ryc(d5KnJ1irpX;u^)o$B>+xpO-vzf@YX zGZO(>)3~Vqr`=*bC?0TuJA1tlP5z;7TDbS+)5pQZ4S7jyg+0qS22nLHAE3{^kVmvj$NQGuwaJ)$zSlM1L1I5u|fHQ?w_ z*Ey;>2pb$@HDqedET_CTPOyej84(rE#MVK%k}jJQKm6fGfi^orWkfg`g=w8Retqyn z=6Jc-^zH<1EhrisUJh_l-zi4yvDMl8|W~rfS`Y zW~cGoIafDZ_cqXt99Io)(CkMyJLS+=9kMoepYuq`z}f?L*D>Y|!*v-FrnHvfUSxs| zXEFakEqedN_|}2R1clR!;L=;qMuU%8$(k#(u~A$Y0!_E|+fiJ9(tnq1z4#P`ej3F} zc}Z7Z)gh_G*X@Zfqb)RPP_p=92Dajh{m#S}MgU6}UuC}pC3stu_!5dFv#~TiF1~CP zVprgiB_8xs46u(==e1#tkt(lB`3Qk*py4JBkBOh1=zmzM4^~NZ*x` zK5=l!>LxgZAdns$av0w$LPLB{u$R!#pLn|Im=+ppY&*D1_i?cG-#evb&1X zTGF$dm<_ziZgTqA`>OFwIAI;N0d_=#K}i}6D*>hi*tH5Ur?mh>K)U|oCbj{03+T{6 zwbniodRR*P!UpFVeP)8Z<*-zO5jH@mqkGyjY#`s@9%&+8} zAo|{-3%-9Dc3ym}J6#5)=`sd;Jo}eD?OtRVLY-tJvdMzwXC-ngc$=1J^{_Km=bWgN zrFO@TC^IBQmZ_~VrOd82F%jWT5)P0i9b5Gb7pl`bQ5fqyPe$%+WHwM{gb^L~yPbu64e4*#*0?4p#G9jNj);*slHR~TNbwxS zbG~^5`a|s2A*{2n1 zyl%cl#@ro~IF44$V~VG09tSj>rn6%kd~F*)&JL65zycovY<#hqkW`kM&0hvHHg$@i zeH!tpVh;zqKR*nsgQDhURNRd5;mxRev`MK+9lb=~I&&I1_sEt!xg9>sOb6BGvZN?QJiaok%)l_7Y)X@(Nm+sxva1W-p?y zFv1cq!`t3b!rADv`q@#kx|x%X^dJkvf5+NHS+Lo|c2dPNK@n`Ky`*D% zNs@vrxUn=+VHOo;k&mo)H+%JlDx>w{*DSGi$+f;@Se_u%8Kz8DRdRWpe%S**-#2#uNYu4>?9ou zBk2dQV7Pw*i`mx+EEt_Wf<*-e)a!o=R#lSe4pmV%v=w9NZ`hcQqj5XX#zmf~!9Ht1 zhtTYWzLtCxVXUV1L9XL18(sEWHf%tc{TzRQyE*wA+42K-*529Qy^x=ZXM!S%{HR?K z#eWq4IRsX%8(@`u;BcM+q5-SO0Kwd%(+jZb;8apSYUBU+PkU%~=EF_DV*`PWvxkgj zB)4wzQ;~L~I``(>Q zNu#4suiTgfn;LpH>a$fjfAbahaO_8&bE1i>PW|}CZ@x;LlU5d#LYJSwn19ax8SUfU S!GEiLy!#)WTQCRLegFW0xB&wI literal 0 HcmV?d00001 diff --git a/plugins/org.eclipse.dd.doc.dsf/docs/common/request_monitor_1.png b/plugins/org.eclipse.dd.doc.dsf/docs/common/request_monitor_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9fec21cd3e277bd802b455aafc290ec5bc51133 GIT binary patch literal 13914 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 T!)(4 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