lttng: Also initialize static state values
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.help / doc / User-Guide.mediawiki
CommitLineData
067490ab
AM
1
2= Introduction =
3
4The purpose of the '''Tracing Monitoring Framework (TMF)''' is to facilitate the integration of tracing and monitoring tools into Eclipse, to provide out-of-the-box generic functionalities/views and provide extension mechanisms of the base functionalities for application specific purposes.
5
6f182760
PT
6= Component Interaction =
7
8TMF provides a mechanism for different components to interact with each other using signals. The signals can carry information that is specific to each signal.
9
10The TMF Signal Manager handles registration of components and the broadcasting of signals to their intended receivers.
11
12Components can register as VIP receivers which will ensure they will receive the signal before non-VIP receivers.
13
14== Sending Signals ==
15
16In order to send a signal, an instance of the signal must be created and passed as argument to the signal manager to be dispatched. Every component that can handle the signal will receive it. The receivers do not need to be known by the sender.
17
18<pre>
19TmfExampleSignal signal = new TmfExampleSignal(this, ...);
20TmfSignalManager.dispatchSignal(signal);
21</pre>
22
23If the sender is an instance of the class TmfComponent, the broadcast method can be used:
24
25<pre>
26TmfExampleSignal signal = new TmfExampleSignal(this, ...);
27broadcast(signal);
28</pre>
29
30== Receiving Signals ==
31
32In order to receive any signal, the receiver must first be registered with the signal manager. The receiver can register as a normal or VIP receiver.
33
34<pre>
35TmfSignalManager.register(this);
36TmfSignalManager.registerVIP(this);
37</pre>
38
39If the receiver is an instance of the class TmfComponent, it is automatically registered as a normal receiver in the constructor.
40
41When the receiver is destroyed or disposed, it should deregister itself from the signal manager.
42
43<pre>
44TmfSignalManager.deregister(this);
45</pre>
46
47To actually receive and handle any specific signal, the receiver must use the @TmfSignalHandler annotation and implement a method that will be called when the signal is broadcast. The name of the method is irrelevant.
48
49<pre>
50@TmfSignalHandler
51public void example(TmfExampleSignal signal) {
52 ...
53}
54</pre>
55
56The source of the signal can be used, if necessary, by a component to filter out and ignore a signal that was broadcast by itself when the component is also a receiver of the signal but only needs to handle it when it was sent by another component or another instance of the component.
57
58== Signal Throttling ==
59
60It is possible for a TmfComponent instance to buffer the dispatching of signals so that only the last signal queued after a specified delay without any other signal queued is sent to the receivers. All signals that are preempted by a newer signal within the delay are discarded.
61
62The signal throttler must first be initialized:
63
64<pre>
65final int delay = 100; // in ms
66TmfSignalThrottler throttler = new TmfSignalThrottler(this, delay);
67</pre>
68
69Then the sending of signals should be queued through the throttler:
70
71<pre>
72TmfExampleSignal signal = new TmfExampleSignal(this, ...);
73throttler.queue(signal);
74</pre>
75
76When the throttler is no longer needed, it should be disposed:
77
78<pre>
79throttler.dispose();
80</pre>
81
82== Signal Reference ==
83
84The following is a list of built-in signals defined in the framework.
85
86=== TmfStartSynchSignal ===
87
88''Purpose''
89
90This signal is used to indicate the start of broadcasting of a signal. Internally, the data provider will not fire event requests until the corresponding TmfEndSynchSignal signal is received. This allows coalescing of requests triggered by multiple receivers of the broadcast signal.
91
92''Senders''
93
94Sent by TmfSignalManager before dispatching a signal to all receivers.
95
96''Receivers''
97
98Received by TmfDataProvider.
99
100=== TmfEndSynchSignal ===
101
102''Purpose''
103
104This signal is used to indicate the end of broadcasting of a signal. Internally, the data provider fire all pending event requests that were received and buffered since the corresponding TmfStartSynchSignal signal was received. This allows coalescing of requests triggered by multiple receivers of the broadcast signal.
105
106''Senders''
107
108Sent by TmfSignalManager after dispatching a signal to all receivers.
109
110''Receivers''
111
112Received by TmfDataProvider.
113
114=== TmfTraceOpenedSignal ===
115
116''Purpose''
117
118This signal is used to indicate that a trace has been opened in an editor.
119
120''Senders''
121
122Sent by a TmfEventsEditor instance when it is created.
123
124''Receivers''
125
126Received by TmfTrace, TmfExperiment, TmfTraceManager and every view that shows trace data. Components that show trace data should handle this signal.
127
128=== TmfTraceSelectedSignal ===
129
130''Purpose''
131
132This signal is used to indicate that a trace has become the currently selected trace.
133
134''Senders''
135
136Sent by a TmfEventsEditor instance when it receives focus. Components can send this signal to make a trace editor be brought to front.
137
138''Receivers''
139
140Received by TmfTraceManager and every view that shows trace data. Components that show trace data should handle this signal.
141
142=== TmfTraceClosedSignal ===
143
144''Purpose''
145
146This signal is used to indicate that a trace editor has been closed.
147
148''Senders''
149
150Sent by a TmfEventsEditor instance when it is disposed.
151
152''Receivers''
153
154Received by TmfTraceManager and every view that shows trace data. Components that show trace data should handle this signal.
155
156=== TmfTraceRangeUpdatedSignal ===
157
158''Purpose''
159
160This signal is used to indicate that the valid time range of a trace has been updated. This triggers indexing of the trace up to the end of the range. In the context of streaming, this end time is considered a safe time up to which all events are guaranteed to have been completely received. For non-streaming traces, the end time is set to infinity indicating that all events can be read immediately. Any processing of trace events that wants to take advantage of request coalescing should be triggered by this signal.
161
162''Senders''
163
164Sent by TmfExperiment and non-streaming TmfTrace. Streaming traces should send this signal in the TmfTrace subclass when a new safe time is determined by a specific implementation.
165
166''Receivers''
167
168Received by TmfTrace, TmfExperiment and components that process trace events. Components that need to process trace events should handle this signal.
169
170=== TmfTraceUpdatedSignal ===
171
172''Purpose''
173
174This signal is used to indicate that new events have been indexed for a trace.
175
176''Senders''
177
178Sent by TmfCheckpointIndexer when new events have been indexed and the number of events has changed.
179
180''Receivers''
181
182Received by components that need to be notified of a new trace event count.
183
184=== TmfTimeSynchSignal ===
185
186''Purpose''
187
188This signal is used to indicate that a new time has been selected.
189
190''Senders''
191
192Sent by any component that allows the user to select a time.
193
194''Receivers''
195
196Received by any component that needs to be notified of the currently selected time.
197
198=== TmfRangeSynchSignal ===
199
200''Purpose''
201
202This signal is used to indicate that a new time range window has been set.
203
204''Senders''
205
206Sent by any component that allows the user to set a time range window.
207
208''Receivers''
209
210Received by any component that needs to be notified of the current visible time range window.
211
212=== TmfEventFilterAppliedSignal ===
213
214''Purpose''
215
216This signal is used to indicate that a filter has been applied to a trace.
217
218''Senders''
219
220Sent by TmfEventsTable when a filter is applied.
221
222''Receivers''
223
224Received by any component that shows trace data and needs to be notified of applied filters.
225
226=== TmfEventSearchAppliedSignal ===
227
228''Purpose''
229
230This signal is used to indicate that a search has been applied to a trace.
231
232''Senders''
233
234Sent by TmfEventsTable when a search is applied.
235
236''Receivers''
237
238Received by any component that shows trace data and needs to be notified of applied searches.
239
240=== TmfTimestampFormatUpdateSignal ===
241
242''Purpose''
243
244This signal is used to indicate that the timestamp format preference has been updated.
245
246''Senders''
247
248Sent by TmfTimestampFormat when the default timestamp format preference is changed.
249
250''Receivers''
251
252Received by any component that needs to refresh its display for the new timestamp format.
253
254=== TmfStatsUpdatedSignal ===
255
256''Purpose''
257
258This signal is used to indicate that the statistics data model has been updated.
259
260''Senders''
261
262Sent by statistic providers when new statistics data has been processed.
263
264''Receivers''
265
266Received by statistics viewers and any component that needs to be notified of a statistics update.
267
268== Debugging ==
269
270TMF has built-in Eclipse tracing support for the debugging of signal interaction between components. To enable it, open the '''Run/Debug Configuration...''' dialog, select a configuration, click the '''Tracing''' tab, select the plug-in '''org.eclipse.linuxtools.tmf.core''', and check the '''signal''' item.
271
272All signals sent and received will be logged to the file TmfTrace.log located in the Eclipse home directory.
273
067490ab
AM
274= TMF UML2 Sequence Diagram Framework =
275
276The purpose of the UML2 Sequence Diagram Framework of TMF is to provide a framework for generation of UML2 sequence diagrams. It provides
277*UML2 Sequence diagram drawing capabilities (i.e. lifelines, messages, activations, object creation and deletion)
278*a generic, re-usable Sequence Diagram View
279*Eclipse Extension Point for the creation of sequence diagrams
280*callback hooks for searching and filtering within the Sequence Diagram View
281*scalability<br>
282The following chapters describe the Sequence Diagram Framework as well as a reference implementation and its usage.
283
284== TMF UML2 Sequence Diagram Extensions ==
285
286In the UML2 Sequence Diagram Framework an Eclipse extension point is defined so that other plug-ins can contribute code to create sequence diagram.
287
288'''Identifier''': org.eclipse.linuxtools.tmf.ui.uml2SDLoader<br>
289'''Since''': Since 0.3.2 (based on UML2SD of org.eclipse.tptp.common.ui)<br>
290'''Description''': This extension point aims to list and connect any UML2 Sequence Diagram loader.<br>
291'''Configuration Markup''':<br>
292
293<pre>
294<!ELEMENT extension (uml2SDLoader)+>
295<!ATTLIST extension
296point CDATA #REQUIRED
297id CDATA #IMPLIED
298name CDATA #IMPLIED
299>
300</pre>
301
302*point - A fully qualified identifier of the target extension point.
303*id - An optional identifier of the extension instance.
304*name - An optional name of the extension instance.
305
306<pre>
307<!ELEMENT uml2SDLoader EMPTY>
308<!ATTLIST uml2SDLoader
309id CDATA #REQUIRED
310name CDATA #REQUIRED
311class CDATA #REQUIRED
312view CDATA #REQUIRED
313default (true | false)
314</pre>
315
fac4e45b 316*id - A unique identifier for this uml2SDLoader. This is not mandatory as long as the id attribute cannot be retrieved by the provider plug-in. The class attribute is the one on which the underlying algorithm relies.
067490ab
AM
317*name - An name of the extension instance.
318*class - The implementation of this UML2 SD viewer loader. The class must implement org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader.
319*view - The view ID of the view that this loader aims to populate. Either org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView itself or a extension of org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView.
320*default - Set to true to make this loader the default one for the view; in case of several default loaders, first one coming from extensions list is taken.
321
322
323== Management of the Extension Point ==
324
325The TMF UI plug-in is responsible for evaluating each contribution to the extension point.
326<br>
327<br>
328With this extension point, a loader class is associated with a Sequence Diagram View. Multiple loaders can be associated to a single Sequence Diagram View. However, additional means have to be implemented to specify which loader should be used when opening the view. For example, an eclipse action or command could be used for that. This additional code is not necessary if there is only one loader for a given Sequence Diagram View associated and this loader has the attribute "default" set to "true". (see also [[#Using one Sequence Diagram View with Multiple Loaders | Using one Sequence Diagram View with Multiple Loaders]])
329
330== Sequence Diagram View ==
331
332For this extension point a Sequence Diagram View has to be defined as well. The Sequence Diagram View class implementation is provided by the plug-in ''org.eclipse.linuxtools.tmf.ui'' (''org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView'') and can be used as is or can also be sub-classed. For that, a view extension has to be added to the ''plugin.xml''.
333
334=== Supported Widgets ===
335
336The loader class provides a frame containing all the UML2 widgets to be displayed. The following widgets exist:
337
338*Lifeline
339*Activation
340*Synchronous Message
341*Asynchronous Message
342*Synchronous Message Return
343*Asynchronous Message Return
344*Stop
345
346For a lifeline, a category can be defined. The lifeline category defines icons, which are displayed in the lifeline header.
347
348=== Zooming ===
349
350The Sequence Diagram View allows the user to zoom in, zoom out and reset the zoom factor.
351
352=== Printing ===
353
354It is possible to print the whole sequence diagram as well as part of it.
355
356=== Key Bindings ===
357
358*SHIFT+ALT+ARROW-DOWN - to scroll down within sequence diagram one view page at a time
359*SHIFT+ALT+ARROW-UP - to scroll up within sequence diagram one view page at a time
360*SHIFT+ALT+ARROW-RIGHT - to scroll right within sequence diagram one view page at a time
361*SHIFT+ALT+ARROW-LEFT - to scroll left within sequence diagram one view page at a time
362*SHIFT+ALT+ARROW-HOME - to jump to the beginning of the selected message if not already visible in page
363*SHIFT+ALT+ARROW-END - to jump to the end of the selected message if not already visible in page
364*CTRL+F - to open find dialog if either the basic or extended find provider is defined (see [[#Using the Find Provider Interface | Using the Find Provider Interface]])
365*CTRL+P - to open print dialog
366
367=== Preferences ===
368
369The UML2 Sequence Diagram Framework provides preferences to customize the appearance of the Sequence Diagram View. The color of all widgets and text as well as the fonts of the text of all widget can be adjust. Amongst others the default lifeline width can be alternated. To change preferences select '''Windows->Preferences->Tracing->UML2 Sequence Diagrams'''. The following preference page will show:<br>
370[[Image:images/SeqDiagramPref.png]] <br>
371After changing the preferences select '''OK'''.
372
373=== Callback hooks ===
374
375The Sequence Diagram View provides several callback hooks so that extension can provide application specific functionality. The following interfaces can be provided:
376* Basic find provider or extended find Provider<br> For finding within the sequence diagram
377* Basic filter provider and extended Filter Provider<br> For filtering within the sequnce diagram.
378* Basic paging provider or advanced paging provider<br> For scalability reasons, used to limit number of displayed messages
379* Properies provider<br> To provide properties of selected elements
380* Collapse provider <br> To collapse areas of the sequence diagram
381
382== Tutorial ==
383
384This tutorial describes how to create a UML2 Sequence Diagram Loader extension and use this loader in the in Eclipse.
385
386=== Prerequisites ===
387
388The tutorial is based on Eclipse 3.7 (Eclipse Indigo) and TMF 0.3.2.
389
390=== Creating an Eclipse UI Plug-in ===
391
392To create a new project with name org.eclipse.linuxtools.tmf.sample.ui select '''File -> New -> Project -> Plug-in Development -> Plug-in Project'''. <br>
393[[Image:images/Screenshot-NewPlug-inProject1.png]]<br>
394
395[[Image:images/Screenshot-NewPlug-inProject2.png]]<br>
396
f5b8868d 397[[Image:images/Screenshot-NewPlug-inProject3.png]]<br>
067490ab
AM
398
399=== Creating a Sequence Diagram View ===
400
401To open the plug-in manifest, double-click on the MANIFEST.MF file. <br>
402[[Image:images/SelectManifest.png]]<br>
403
404Change to the Dependencies tab and select '''Add...''' of the ''Required Plug-ins'' section. A new dialog box will open. Next find plug-in ''org.eclipse.linuxtools.tmf.ui'' and press '''OK'''<br>
405[[Image:images/AddDependencyTmfUi.png]]<br>
406
407Change to the Extensions tab and select '''Add...''' of the ''All Extension'' section. A new dialog box will open. Find the view extension ''org.eclipse.ui.views'' and press '''Finish'''.<br>
408[[Image:images/AddViewExtension1.png]]<br>
409
410To create a Sequence Diagram View, click the right mouse button. Then select '''New -> view'''<br>
411[[Image:images/AddViewExtension2.png]]<br>
412
413A new view entry has been created. Fill in the fields ''id'', ''name'' and ''class''. Note that for ''class'' the SD view implementation (''org.eclipse.linuxtools.tmf.ui.views.SDView'') of the TMF UI plug-in is used.<br>
414[[Image:images/FillSampleSeqDiagram.png]]<br>
415
416The view is prepared. Run the Example. To launch the an Eclipse Application select the ''Overview'' tab and click on '''Launch an Eclipse Application'''<br>
417[[Image:images/RunEclipseApplication.png]]<br>
418
419A new Eclipse application window will show. In the new window go to '''Windows -> Show View -> Other... -> Other -> Sample Sequence Diagram'''.<br>
420[[Image:images/ShowViewOther.png]]<br>
421
422The Sequence Diagram View will open with an blank page.<br>
423[[Image:images/BlankSampleSeqDiagram.png]]<br>
424
425Close the Example Application.
426
427=== Defining the uml2SDLoader Extension ===
428
429After defining the Sequence Diagram View it's time to create the ''uml2SDLoader'' Extension. <br>
430
431Before doing that add a dependency to TMF. For that select '''Add...''' of the ''Required Plug-ins'' section. A new dialog box will open. Next find plug-in ''org.eclipse.linuxtools.tmf'' and press '''OK'''<br>
432[[Image:images/AddDependencyTmf.png]]<br>
433
434To create the loader extension, change to the Extensions tab and select '''Add...''' of the ''All Extension'' section. A new dialog box will open. Find the extension ''org.eclipse.linuxtools.tmf.ui.uml2SDLoader'' and press '''Finish'''.<br>
435[[Image:images/AddTmfUml2SDLoader.png]]<br>
436
437A new 'uml2SDLoader'' extension has been created. Fill in fields ''id'', ''name'', ''class'', ''view'' and ''default''. Use ''default'' equal true for this example. For the view add the id of the Sequence Diagram View of chapter [[#Creating a Sequence Diagram View | Creating a Sequence Diagram View]]. <br>
438[[Image:images/FillSampleLoader.png]]<br>
439
440Then click on ''class'' (see above) to open the new class dialog box. Fill in the relevant fields and select '''Finish'''. <br>
441[[Image:images/NewSampleLoaderClass.png]]<br>
442
443A new Java class will be created which implements the interface ''org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader''.<br>
444
445<pre>
446package org.eclipse.linuxtools.tmf.sample.ui;
447
448import org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView;
449import org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader;
450
451public class SampleLoader implements IUml2SDLoader {
452
453 public SampleLoader() {
454 // TODO Auto-generated constructor stub
455 }
456
457 @Override
458 public void dispose() {
459 // TODO Auto-generated method stub
460
461 }
462
463 @Override
464 public String getTitleString() {
465 // TODO Auto-generated method stub
466 return null;
467 }
468
469 @Override
470 public void setViewer(SDView arg0) {
471 // TODO Auto-generated method stub
472
473 }
474</pre>
475
476=== Implementing the Loader Class ===
477
478Next is to implement the methods of the IUml2SDLoader interface method. The following code snippet shows how to create the major sequence diagram elements. Please note that no time information is stored.<br>
479
480<pre>
481package org.eclipse.linuxtools.tmf.sample.ui;
482
483import org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView;
484import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.AsyncMessage;
485import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.AsyncMessageReturn;
486import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.ExecutionOccurrence;
487import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Frame;
488import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Lifeline;
489import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Stop;
490import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.SyncMessage;
491import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.SyncMessageReturn;
492import org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader;
493
494public class SampleLoader implements IUml2SDLoader {
495
496 private SDView fSdView;
497
498 public SampleLoader() {
499 }
500
501 @Override
502 public void dispose() {
503 }
504
505 @Override
506 public String getTitleString() {
507 return "Sample Diagram";
508 }
509
510 @Override
511 public void setViewer(SDView arg0) {
512 fSdView = arg0;
513 createFrame();
514 }
515
516 private void createFrame() {
517
518 Frame testFrame = new Frame();
519 testFrame.setName("Sample Frame");
520
521 /*
522 * Create lifelines
523 */
524
525 Lifeline lifeLine1 = new Lifeline();
526 lifeLine1.setName("Object1");
527 testFrame.addLifeLine(lifeLine1);
528
529 Lifeline lifeLine2 = new Lifeline();
530 lifeLine2.setName("Object2");
531 testFrame.addLifeLine(lifeLine2);
532
533
534 /*
535 * Create Sync Message
536 */
537 // Get new occurrence on lifelines
538 lifeLine1.getNewEventOccurrence();
539
540 // Get Sync message instances
541 SyncMessage start = new SyncMessage();
542 start.setName("Start");
543 start.setEndLifeline(lifeLine1);
544 testFrame.addMessage(start);
545
546 /*
547 * Create Sync Message
548 */
549 // Get new occurrence on lifelines
550 lifeLine1.getNewEventOccurrence();
551 lifeLine2.getNewEventOccurrence();
552
553 // Get Sync message instances
554 SyncMessage syn1 = new SyncMessage();
555 syn1.setName("Sync Message 1");
556 syn1.setStartLifeline(lifeLine1);
557 syn1.setEndLifeline(lifeLine2);
558 testFrame.addMessage(syn1);
559
560 /*
561 * Create corresponding Sync Message Return
562 */
563
564 // Get new occurrence on lifelines
565 lifeLine1.getNewEventOccurrence();
566 lifeLine2.getNewEventOccurrence();
567
568 SyncMessageReturn synReturn1 = new SyncMessageReturn();
569 synReturn1.setName("Sync Message Return 1");
570 synReturn1.setStartLifeline(lifeLine2);
571 synReturn1.setEndLifeline(lifeLine1);
572 synReturn1.setMessage(syn1);
573 testFrame.addMessage(synReturn1);
574
575 /*
576 * Create Activations (Execution Occurrence)
577 */
578 ExecutionOccurrence occ1 = new ExecutionOccurrence();
579 occ1.setStartOccurrence(start.getEventOccurrence());
580 occ1.setEndOccurrence(synReturn1.getEventOccurrence());
581 lifeLine1.addExecution(occ1);
582 occ1.setName("Activation 1");
583
584 ExecutionOccurrence occ2 = new ExecutionOccurrence();
585 occ2.setStartOccurrence(syn1.getEventOccurrence());
586 occ2.setEndOccurrence(synReturn1.getEventOccurrence());
587 lifeLine2.addExecution(occ2);
588 occ2.setName("Activation 2");
589
590 /*
591 * Create Sync Message
592 */
593 // Get new occurrence on lifelines
594 lifeLine1.getNewEventOccurrence();
595 lifeLine2.getNewEventOccurrence();
596
597 // Get Sync message instances
598 AsyncMessage asyn1 = new AsyncMessage();
599 asyn1.setName("Async Message 1");
600 asyn1.setStartLifeline(lifeLine1);
601 asyn1.setEndLifeline(lifeLine2);
602 testFrame.addMessage(asyn1);
603
604 /*
605 * Create corresponding Sync Message Return
606 */
607
608 // Get new occurrence on lifelines
609 lifeLine1.getNewEventOccurrence();
610 lifeLine2.getNewEventOccurrence();
611
612 AsyncMessageReturn asynReturn1 = new AsyncMessageReturn();
613 asynReturn1.setName("Async Message Return 1");
614 asynReturn1.setStartLifeline(lifeLine2);
615 asynReturn1.setEndLifeline(lifeLine1);
616 asynReturn1.setMessage(asyn1);
617 testFrame.addMessage(asynReturn1);
618
619 /*
620 * Create a note
621 */
622
623 // Get new occurrence on lifelines
624 lifeLine1.getNewEventOccurrence();
625
626 EllipsisisMessage info = new EllipsisisMessage();
627 info.setName("Object deletion");
628 info.setStartLifeline(lifeLine2);
629 testFrame.addNode(info);
630
631 /*
632 * Create a Stop
633 */
634 Stop stop = new Stop();
635 stop.setLifeline(lifeLine2);
636 stop.setEventOccurrence(lifeLine2.getNewEventOccurrence());
637 lifeLine2.addNode(stop);
638
639 fSdView.setFrame(testFrame);
640 }
641}
642</pre>
643
644Now it's time to run the example application. To launch the Example Application select the ''Overview'' tab and click on '''Launch an Eclipse Application'''<br>
645[[Image:images/SampleDiagram1.png]] <br>
646
647=== Adding time information ===
648
649To add time information in sequence diagram the timestamp has to be set for each message. The sequence diagram framework uses the ''TmfTimestamp'' class of plug-in ''org.eclipse.linuxtools.tmf''. Use ''setTime()'' on each message ''SyncMessage'' since start and end time are the same. For each ''AsyncMessage'' set start and end time separately by using methods ''setStartTime'' and ''setEndTime''. For example: <br>
650
651<pre>
652 private void createFrame() {
653 //...
fac4e45b
BH
654 start.setTime(new TmfTimestamp(1000, -3));
655 syn1.setTime(new TmfTimestamp(1005, -3));
656 synReturn1.setTime(new TmfTimestamp(1050, -3));
657 asyn1.setStartTime(new TmfTimestamp(1060, -3));
658 asyn1.setEndTime(new TmfTimestamp(1070, -3));
659 asynReturn1.setStartTime(new TmfTimestamp(1060, -3));
660 asynReturn1.setEndTime(new TmfTimestamp(1070, -3));
067490ab
AM
661 //...
662 }
663</pre>
664
665When running the example application, a time compression bar on the left appears which indicates the time elapsed between consecutive events. The time compression scale shows where the time falls between the minimum and maximum delta times. The intensity of the color is used to indicate the length of time, namely, the deeper the intensity, the higher the delta time. The minimum and maximum delta times are configurable through the collbar menu ''Configure Min Max''. The time compression bar and scale may provide an indication about which events consumes the most time. By hovering over the time compression bar a tooltip appears containing more information. <br>
666
667[[Image:images/SampleDiagramTimeComp.png]] <br>
668
669By hovering over a message it will show the time information in the appearing tooltip. For each ''SyncMessage'' it shows its time occurrence and for each ''AsyncMessage'' it shows the start and end time.
670
671[[Image:images/SampleDiagramSyncMessage.png]] <br>
672[[Image:images/SampleDiagramAsyncMessage.png]] <br>
673
674To see the time elapsed between 2 messages, select one message and hover over a second message. A tooltip will show with the delta in time. Note if the second message is before the first then a negative delta is displayed. Note that for ''AsynMessage'' the end time is used for the delta calculation.<br>
675[[Image:images/SampleDiagramMessageDelta.png]] <br>
676
677=== Default Coolbar and Menu Items ===
678
679The Sequence Diagram View comes with default coolbar and menu items. By default, each sequence diagram shows the following actions:
680* Zoom in
681* Zoom out
682* Reset Zoom Factor
683* Selection
684* Configure Min Max (drop-down menu only)
685* Navigation -> Show the node end (drop-down menu only)
686* Navigation -> Show the node start (drop-down menu only)
687
688[[Image:images/DefaultCoolbarMenu.png]]<br>
689
690=== Implementing Optional Callbacks ===
691
692The following chapters describe how to use all supported provider interfaces.
693
694==== Using the Paging Provider Interface ====
695
696For scalability reasons, the paging provider interfaces exists to limit the number of messages displayed in the Sequence Diagram View at a time. For that, two interfaces exist, the basic paging provider and the advanced paging provider. When using the basic paging interface, actions for traversing page by page through the sequence diagram of a trace will be provided.
697<br>
698To use the basic paging provider, first the interface methods of the ''ISDPagingProvider'' have to be implemented by a class. (i.e. ''hasNextPage()'', ''hasPrevPage()'', ''nextPage()'', ''prevPage()'', ''firstPage()'' and ''endPage()''. Typically, this is implemented in the loader class. Secondly, the provider has to be set in the Sequence Diagram View. This will be done in the ''setViewer()'' method of the loader class. Lastly, the paging provider has to be removed from the view, when the ''dispose()'' method of the loader class is called.
699
700<pre>
701public class SampleLoader implements IUml2SDLoader, ISDPagingProvider {
702 //...
703 private page = 0;
704
705 @Override
706 public void dispose() {
707 if (fSdView != null) {
708 fSdView.resetProviders();
709 }
710 }
711
712 @Override
713 public void setViewer(SDView arg0) {
714 fSdView = arg0;
715 fSdView.setSDPagingProvider(this);
716 createFrame();
717 }
718
719 private void createSecondFrame() {
720 Frame testFrame = new Frame();
721 testFrame.setName("SecondFrame");
722 Lifeline lifeline = new Lifeline();
723 lifeline.setName("LifeLine 0");
724 testFrame.addLifeLine(lifeline);
725 lifeline = new Lifeline();
726 lifeline.setName("LifeLine 1");
727 testFrame.addLifeLine(lifeline);
728 for (int i = 1; i < 5; i++) {
729 SyncMessage message = new SyncMessage();
730 message.autoSetStartLifeline(testFrame.getLifeline(0));
731 message.autoSetEndLifeline(testFrame.getLifeline(0));
732 message.setName((new StringBuilder("Message ")).append(i).toString());
733 testFrame.addMessage(message);
734
735 SyncMessageReturn messageReturn = new SyncMessageReturn();
736 messageReturn.autoSetStartLifeline(testFrame.getLifeline(0));
737 messageReturn.autoSetEndLifeline(testFrame.getLifeline(0));
738
739 testFrame.addMessage(messageReturn);
740 messageReturn.setName((new StringBuilder("Message return ")).append(i).toString());
741 ExecutionOccurrence occ = new ExecutionOccurrence();
742 occ.setStartOccurrence(testFrame.getSyncMessage(i - 1).getEventOccurrence());
743 occ.setEndOccurrence(testFrame.getSyncMessageReturn(i - 1).getEventOccurrence());
744 testFrame.getLifeline(0).addExecution(occ);
745 }
746 fSdView.setFrame(testFrame);
747 }
748
067490ab
AM
749 @Override
750 public boolean hasNextPage() {
751 return page == 0;
752 }
753
067490ab
AM
754 @Override
755 public boolean hasPrevPage() {
756 return page == 1;
757 }
758
067490ab
AM
759 @Override
760 public void nextPage() {
761 page = 1;
762 createSecondFrame();
763 }
764
067490ab
AM
765 @Override
766 public void prevPage() {
767 page = 0;
768 createFrame();
769 }
770
067490ab
AM
771 @Override
772 public void firstPage() {
773 page = 0;
774 createFrame();
775 }
776
067490ab
AM
777 @Override
778 public void lastPage() {
779 page = 1;
780 createSecondFrame();
781 }
782 //...
783}
784
785</pre>
786
787When running the example application, new actions will be shown in the coolbar and the coolbar menu. <br>
788
789[[Image:images/PageProviderAdded.png]]
790
791<br><br>
792To use the advanced paging provider, the interface ''ISDAdvancePagingProvider'' has to be implemented. It extends the basic paging provider. The methods ''currentPage()'', ''pagesCount()'' and ''pageNumberChanged()'' have to be added.
793<br>
794
795==== Using the Find Provider Interface ====
796
fac4e45b 797For finding nodes in a sequence diagram two interfaces exists. One for basic finding and one for extended finding. The basic find comes with a dialog box for entering find criteria as regular expressions. This find criteria can be used to execute the find. Find criteria a persisted in the Eclipse workspace.
067490ab
AM
798<br>
799For the extended find provider interface a ''org.eclipse.jface.action.Action'' class has to be provided. The actual find handling has to be implemented and triggered by the action.
800<br>
801Only on at a time can be active. If the extended find provder is defined it obsoletes the basic find provider.
802<br>
803To use the basic find provider, first the interface methods of the ''ISDFindProvider'' have to be implemented by a class. Typically, this is implemented in the loader class. Add the ISDFindProvider to the list of implemented interfaces, implement the methods ''find()'' and ''cancel()'' and set the provider in the ''setViewer()'' method as well as remove the provider in the ''dispose()'' method of the loader class. Please note that the ''ISDFindProvider'' extends the interface ''ISDGraphNodeSupporter'' which methods (''isNodeSupported()'' and ''getNodeName()'') have to be implemented, too. The following shows an example implementation. Please note that only search for lifelines and SynchMessage are supported. The find itself will always find only the first occurrence the pattern to match.
804
805<pre>
806public class SampleLoader implements IUml2SDLoader, ISDPagingProvider, ISDFindProvider {
807
808 //...
809 @Override
810 public void dispose() {
811 if (fSdView != null) {
812 fSdView.resetProviders();
813 }
814 }
815
816 @Override
817 public void setViewer(SDView arg0) {
818 fSdView = arg0;
819 fSdView.setSDPagingProvider(this);
820 fSdView.setSDFindProvider(this);
821 createFrame();
822 }
11252342 823
067490ab
AM
824 @Override
825 public boolean isNodeSupported(int nodeType) {
826 switch (nodeType) {
827 case ISDGraphNodeSupporter.LIFELINE:
828 case ISDGraphNodeSupporter.SYNCMESSAGE:
829 return true;
830
831 default:
832 break;
833 }
834 return false;
835 }
836
067490ab
AM
837 @Override
838 public String getNodeName(int nodeType, String loaderClassName) {
839 switch (nodeType) {
840 case ISDGraphNodeSupporter.LIFELINE:
841 return "Lifeline";
842 case ISDGraphNodeSupporter.SYNCMESSAGE:
843 return "Sync Message";
844 }
845 return "";
846 }
847
067490ab
AM
848 @Override
849 public boolean find(Criteria criteria) {
850 Frame frame = fSdView.getFrame();
851 if (criteria.isLifeLineSelected()) {
852 for (int i = 0; i < frame.lifeLinesCount(); i++) {
853 if (criteria.matches(frame.getLifeline(i).getName())) {
854 fSdView.getSDWidget().moveTo(frame.getLifeline(i));
855 return true;
856 }
857 }
858 }
859 if (criteria.isSyncMessageSelected()) {
860 for (int i = 0; i < frame.syncMessageCount(); i++) {
861 if (criteria.matches(frame.getSyncMessage(i).getName())) {
862 fSdView.getSDWidget().moveTo(frame.getSyncMessage(i));
863 return true;
864 }
865 }
866 }
867 return false;
868 }
869
067490ab
AM
870 @Override
871 public void cancel() {
872 // reset find parameters
873 }
874 //...
875}
876</pre>
877
878When running the example application, the find action will be shown in the coolbar and the coolbar menu. <br>
879[[Image:images/FindProviderAdded.png]]
880
881To find a sequence diagram node press on the find button of the coolbar (see above). A new dialog box will open. Enter a regular expression in the ''Matching String'' text box, select the node types (e.g. Sync Message) and press '''Find'''. If found the corresponding node will be selected. If not found the dialog box will indicate not found. <br>
882[[Image:images/FindDialog.png]]<br>
883
884Note that the find dialog will be opened by typing the key shortcut CRTL+F.
885
886==== Using the Filter Provider Interface ====
887
fac4e45b 888For filtering of sequence diagram elements two interfaces exists. One basic for filtering and one for extended filtering. The basic filtering comes with two dialog for entering filter criteria as regular expressions and one for selecting the filter to be used. Multiple filters can be active at a time. Filter criteria are persisted in the Eclipse workspace.
067490ab
AM
889<br>
890To use the basic filter provider, first the interface method of the ''ISDFilterProvider'' has to be implemented by a class. Typically, this is implemented in the loader class. Add the ''ISDFilterProvider'' to the list of implemented interfaces, implement the method ''filter()''and set the provider in the ''setViewer()'' method as well as remove the provider in the ''dispose()'' method of the loader class. Please note that the ''ISDFindProvider'' extends the interface ''ISDGraphNodeSupporter'' which methods (''isNodeSupported()'' and ''getNodeName()'') have to be implemented, too. <br>
891Note that no example implementation of ''filter()'' is provided.
892<br>
893
894<pre>
895public class SampleLoader implements IUml2SDLoader, ISDPagingProvider, ISDFindProvider, ISDFilterProvider {
896
897 //...
898 @Override
899 public void dispose() {
900 if (fSdView != null) {
901 fSdView.resetProviders();
902 }
903 }
904
905 @Override
906 public void setViewer(SDView arg0) {
907 fSdView = arg0;
908 fSdView.setSDPagingProvider(this);
909 fSdView.setSDFindProvider(this);
910 fSdView.setSDFilterProvider(this);
911 createFrame();
912 }
913
067490ab
AM
914 @Override
915 public boolean filter(List<?> list) {
916 return false;
917 }
918 //...
919}
920</pre>
921
922When running the example application, the filter action will be shown in the coolbar menu. <br>
923[[Image:images/HidePatternsMenuItem.png]]
924
925To filter select the '''Hide Patterns...''' of the coolbar menu. A new dialog box will open. <br>
926[[Image:images/DialogHidePatterns.png]]
927
928To Add a new filter press '''Add...'''. A new dialog box will open. Enter a regular expression in the ''Matching String'' text box, select the node types (e.g. Sync Message) and press '''Create''''. <br>
929[[Image:images/DialogHidePatterns.png]] <br>
930
931Now back at the Hide Pattern dialog. Select one or more filter and select '''OK'''.
932
933To use the extended filter provider, the interface ''ISDExtendedFilterProvider'' has to be implemented. It will provide a ''org.eclipse.jface.action.Action'' class containing the actual filter handling and filter algorithm.
934
935==== Using the Extended Action Bar Provider Interface ====
936
937The extended action bar provider can be used to add customized actions to the Sequence Diagram View.
938To use the extended action bar provider, first the interface method of the interface ''ISDExtendedActionBarProvider'' has to be implemented by a class. Typically, this is implemented in the loader class. Add the ''ISDExtendedActionBarProvider'' to the list of implemented interfaces, implement the method ''supplementCoolbarContent()'' and set the provider in the ''setViewer()'' method as well as remove the provider in the ''dispose()'' method of the loader class. <br>
939
940<pre>
941public class SampleLoader implements IUml2SDLoader, ISDPagingProvider, ISDFindProvider, ISDFilterProvider, ISDExtendedActionBarProvider {
942 //...
943
944 @Override
945 public void dispose() {
946 if (fSdView != null) {
947 fSdView.resetProviders();
948 }
949 }
950
951 @Override
952 public void setViewer(SDView arg0) {
953 fSdView = arg0;
954 fSdView.setSDPagingProvider(this);
955 fSdView.setSDFindProvider(this);
956 fSdView.setSDFilterProvider(this);
957 fSdView.setSDExtendedActionBarProvider(this);
958 createFrame();
959 }
960
067490ab
AM
961 @Override
962 public void supplementCoolbarContent(IActionBars iactionbars) {
963 Action action = new Action("Refresh") {
964 @Override
965 public void run() {
966 System.out.println("Refreshing...");
967 }
968 };
969 iactionbars.getMenuManager().add(action);
970 iactionbars.getToolBarManager().add(action);
971 }
972 //...
973}
974</pre>
975
976When running the example application, all new actions will be added to the coolbar and coolbar menu according to the implementation of ''supplementCoolbarContent()''<br>.
977For the example above the coolbar and coolbar menu will look as follows.
978
979[[Image:images/SupplCoolbar.png]]
980
981==== Using the Properties Provider Interface====
982
983This interface can be used to provide property information. A property provider which returns an ''IPropertyPageSheet'' (see ''org.eclipse.ui.views'') has to be implemented and set in the Sequence Diagram View. <br>
984
985To use the property provider, first the interface method of the ''ISDPropertiesProvider'' has to be implemented by a class. Typically, this is implemented in the loader class. Add the ''ISDPropertiesProvider'' to the list of implemented interfaces, implement the method ''getPropertySheetEntry()'' and set the provider in the ''setViewer()'' method as well as remove the provider in the ''dispose()'' method of the loader class. Please note that no example is provided here.
986
987Please refer to the following Eclipse articles for more information about properties and tabed properties.
988*[http://www.eclipse.org/articles/Article-Properties-View/properties-view.html | Take control of your properties]
989*[http://www.eclipse.org/articles/Article-Tabbed-Properties/tabbed_properties_view.html | The Eclipse Tabbed Properties View]
990
991==== Using the Collapse Provider Interface ====
992
993This interface can be used to define a provider which responsibility is to collapse two selected lifelines. This can be used to hide a pair of lifelines.
994
995To use the collapse provider, first the interface method of the ''ISDCollapseProvider'' has to be implemented by a class. Typically, this is implemented in the loader class. Add the ISDCollapseProvider to the list of implemented interfaces, implement the method ''collapseTwoLifelines()'' and set the provider in the ''setViewer()'' method as well as remove the provider in the ''dispose()'' method of the loader class. Please note that no example is provided here.
996
997==== Using the Selection Provider Service ====
998
999The Sequence Diagram View comes with a build in selection provider service. To this service listeners can be added. To use the selection provider service, the interface ''ISelectionListener'' of plug-in ''org.eclipse.ui'' has to implemented. Typically this is implemented in loader class. Firstly, add the ''ISelectionListener'' interface to the list of implemented interfaces, implement the method ''selectionChanged()'' and set the listener in method ''setViewer()'' as well as remove the listener in the ''dispose()'' method of the loader class.
1000
1001<pre>
1002public class SampleLoader implements IUml2SDLoader, ISDPagingProvider, ISDFindProvider, ISDFilterProvider, ISDExtendedActionBarProvider, ISelectionListener {
1003
1004 //...
1005 @Override
1006 public void dispose() {
1007 if (fSdView != null) {
1008 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().removePostSelectionListener(this);
1009 fSdView.resetProviders();
1010 }
1011 }
1012
1013 @Override
1014 public String getTitleString() {
1015 return "Sample Diagram";
1016 }
1017
1018 @Override
1019 public void setViewer(SDView arg0) {
1020 fSdView = arg0;
1021 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
1022 fSdView.setSDPagingProvider(this);
1023 fSdView.setSDFindProvider(this);
1024 fSdView.setSDFilterProvider(this);
1025 fSdView.setSDExtendedActionBarProvider(this);
1026
1027 createFrame();
1028 }
1029
067490ab
AM
1030 @Override
1031 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
1032 ISelection sel = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
1033 if (sel != null && (sel instanceof StructuredSelection)) {
1034 StructuredSelection stSel = (StructuredSelection) sel;
1035 if (stSel.getFirstElement() instanceof BaseMessage) {
1036 BaseMessage syncMsg = ((BaseMessage) stSel.getFirstElement());
1037 System.out.println("Message '" + syncMsg.getName() + "' selected.");
1038 }
1039 }
1040 }
1041
1042 //...
1043}
1044</pre>
1045
1046=== Printing a Sequence Diagram ===
1047
1048To print a the whole sequence diagram or only parts of it, select the Sequence Diagram View and select '''File -> Print...''' or type the key combination ''CTRL+P''. A new print dialog will open. <br>
1049
1050[[Image:images/PrintDialog.png]] <br>
1051
1052Fill in all the relevant information, select '''Printer...''' to choose the printer and the press '''OK'''.
1053
1054=== Using one Sequence Diagram View with Multiple Loaders ===
1055
1056A Sequence Diagram View definition can be used with multiple sequence diagram loaders. However, the active loader to be used when opening the view has to be set. For this define an Eclipse action or command and assign the current loader to the view. Here is a code snippet for that:
1057
1058<pre>
1059public class OpenSDView extends AbstractHandler {
1060 @Override
1061 public Object execute(ExecutionEvent event) throws ExecutionException {
1062 try {
1063 IWorkbenchPage persp = TmfUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
1064 SDView view = (SDView) persp.showView("org.eclipse.linuxtools.ust.examples.ui.componentinteraction");
1065 LoadersManager.getLoadersManager().createLoader("org.eclipse.linuxtools.tmf.ui.views.uml2sd.impl.TmfUml2SDSyncLoader", view);
1066 } catch (PartInitException e) {
1067 throw new ExecutionException("PartInitException caught: ", e);
1068 }
1069 return null;
1070 }
1071}
1072</pre>
1073
1074=== Downloading the Tutorial ===
1075
fac4e45b 1076Use the following link to download the source code of the tutorial [http://wiki.eclipse.org/images/e/e6/SamplePlugin.zip Plug-in of Tutorial].
067490ab
AM
1077
1078== Integration of Tracing and Monitoring Framework with Sequence Diagram Framework ==
1079
1080In the previous sections the Sequence Diagram Framework has been described and a tutorial was provided. In the following sections the integration of the Sequence Diagram Framework with other features of TMF will be described. Together it is a powerful framework to analyze and visualize content of traces. The integration is explained using the reference implementation of a UML2 sequence diagram loader which part of the TMF UI delivery. The reference implementation can be used as is, can be sub-classed or simply be an example for other sequence diagram loaders to be implemented.
1081
1082=== Reference Implementation ===
1083
1084A Sequence Diagram View Extension is defined in the plug-in TMF UI as well as a uml2SDLoader Extension with the reference loader.
1085
1086[[Image:images/ReferenceExtensions.png]]
1087
1088=== Used Sequence Diagram Features ===
1089
1090Besides the default features of the Sequence Diagram Framework, the reference implementation uses the following additional features:
1091*Advanced paging
1092*Basic finding
1093*Basic filtering
1094*Selection Service
1095
1096==== Advanced paging ====
1097
1098The reference loader implements the interface ''ISDAdvancedPagingProvider'' interface. Please refer to section [[#Using the Paging Provider Interface | Using the Paging Provider Interface]] for more details about the advanced paging feature.
1099
1100==== Basic finding ====
1101
1102The reference loader implements the interface ''ISDFindProvider'' interface. The user can search for ''Lifelines'' and ''Interactions''. The find is done across pages. If the expression to match is not on the current page a new thread is started to search on other pages. If expression is found the corresponding page is shown as well as the searched item is displayed. If not found then a message is displayed in the ''Progress View'' of Eclipse. Please refer to section [[#Using the Find Provider Interface | Using the Find Provider Interface]] for more details about the basic find feature.
1103
1104==== Basic filtering ====
1105
1106The reference loader implements the interface ''ISDFilterProvider'' interface. The user can filter on ''Lifelines'' and ''Interactions''. Please refer to section [[#Using the Filter Provider Interface | Using the Filter Provider Interface]] for more details about the basic filter feature.
1107
1108==== Selection Service ====
1109
1110The reference loader implements the interface ''ISelectionListener'' interface. When an interaction is selected a ''TmfTimeSynchSignal'' is broadcast (see [[#TMF Signal Framework | TMF Signal Framework]]). Please also refer to section [[#Using the Selection Provider Service | Using the Selection Provider Service]] for more details about the selection service and .
1111
1112=== Used TMF Features ===
1113
1114The reference implementation uses the following features of TMF:
1115*TMF Experiment and Trace for accessing traces
1116*Event Request Framework to request TMF events from the experiment and respective traces
1117*Signal Framework for broadcasting and receiving TMF signals for synchronization purposes
1118
1119==== TMF Experiment and Trace for accessing traces ====
1120
1121The reference loader uses TMF Experiments to access traces and to request data from the traces.
1122
1123==== TMF Event Request Framework ====
1124
1125The reference loader use the TMF Event Request Framework to request events from the experiment and its traces.
1126
1127When opening a traces (which is triggered by signal ''TmfExperimentSelected'') or when opening the Sequence Diagram View after a trace had been opened previously, a TMF background request is initiated to index the trace and to fill in the first page of the sequence diagram. The purpose of the indexing is to store time ranges for pages with 10000 messages per page. This allows quickly to move to certain pages in a trace without having to re-parse from the beginning. The request is called indexing request.
1128
1129When switching pages, the a TMF foreground event request is initiated to retrieve the corresponding events from the experiment. It uses the time range stored in the index for the respective page.
1130
1131A third type of event request is issued for finding specific data across pages.
1132
1133==== TMF Signal Framework ====
1134
1135The reference loader extends the class ''TmfComponent''. By doing that the loader is register as TMF signal handler for sending and receiving TMF signals. The loader implements signal handlers for the following TMF signals:
fac4e45b
BH
1136*''TmfTraceSelectedSignal''
1137This signal indicates that a trace or experiment was selected. When receiving this signal the indexing request is initiated and the first page is displayed after receiving the relevant information.
1138*''traceClosed''
1139This signal indicates that a trace or experiment was closed. When receiving this signal the loader resets its data and a blank page is loaded in the Sequence Diagram View.
067490ab 1140*''TmfTimeSynchSignal''
fac4e45b 1141This signal indicates that a event with a certain timestamp is selected. When receiving this signal the corresponding message is selected in the Sequence Diagram View. If necessary, the page is changed.
067490ab
AM
1142*''TmfRangeSynchSignal''
1143This signal indicates that a new time range is in focus. When receiving this signal the loader loads the page which corresponds to the start time of the time range signal. The message with the start time will be in focus.
1144
fac4e45b 1145Besides acting on receiving signals, the reference loader is also sending signals. A ''TmfTimeSynchSignal'' is broadcasted with the timestamp of the message which was selected in the Sequence Diagram View. ''TmfRangeSynchSignal'' is sent when a page is changed in the Sequence Diagram View. The start timestamp of the time range sent is the timestamp of the first message. The end timestamp sent is the timestamp of the first message plus the current time range window. The current time range window is the time window that was indicated in the last received ''TmfRangeSynchSignal''.
067490ab
AM
1146
1147=== Supported Traces ===
1148
fac4e45b 1149The reference implementation is able to analyze traces from a single component that traces the interaction with other components. For example, a server node could have trace information about its interaction with client nodes. The server node could be traced and then analyzed using TMF and the Sequence Diagram Framework of TMF could used to visualize the interactions with the client nodes.<br>
067490ab
AM
1150
1151Note that combined traces of multiple components, that contain the trace information about the same interactions are not supported in the reference implementation!
1152
1153=== Trace Format ===
1154
1155The reference implementation in class ''TmfUml2SDSyncLoader'' in package ''org.eclipse.linuxtools.tmf.ui.views.uml2sd.impl'' analyzes events from type ''ITmfEvent'' and creates events type ''ITmfSyncSequenceDiagramEvent'' if the ''ITmfEvent'' contains all relevant information information. The parsing algorithm looks like as follows:
1156
1157<pre>
1158 /**
1159 * @param tmfEvent Event to parse for sequence diagram event details
1160 * @return sequence diagram event if details are available else null
1161 */
fac4e45b 1162 protected ITmfSyncSequenceDiagramEvent getSequenceDiagramEvent(ITmfEvent tmfEvent){
067490ab
AM
1163 //type = .*RECEIVE.* or .*SEND.*
1164 //content = sender:<sender name>:receiver:<receiver name>,signal:<signal name>
1165 String eventType = tmfEvent.getType().toString();
fac4e45b
BH
1166 if (eventType.contains(Messages.TmfUml2SDSyncLoader_EventTypeSend) || eventType.contains(Messages.TmfUml2SDSyncLoader_EventTypeReceive)) {
1167 Object sender = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldSender);
1168 Object receiver = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldReceiver);
1169 Object name = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldSignal);
067490ab
AM
1170 if ((sender instanceof ITmfEventField) && (receiver instanceof ITmfEventField) && (name instanceof ITmfEventField)) {
1171 ITmfSyncSequenceDiagramEvent sdEvent = new TmfSyncSequenceDiagramEvent(tmfEvent,
1172 ((ITmfEventField) sender).getValue().toString(),
1173 ((ITmfEventField) receiver).getValue().toString(),
1174 ((ITmfEventField) name).getValue().toString());
1175
1176 return sdEvent;
1177 }
1178 }
1179 return null;
fac4e45b 1180 }
067490ab
AM
1181</pre>
1182
1183The analysis looks for event type Strings containing ''SEND'' and ''RECEIVE''. If event type matches these key words, the analyzer will look for strings ''sender'', ''receiver'' and ''signal'' in the event fields of type ''ITmfEventField''. If all the data is found a sequence diagram event from can be created. Note that Sync Messages are assumed, which means start and end time are the same.
1184
1185=== How to use the Reference Implementation ===
1186
1187An example trace visualizer is provided that uses a trace in binary format. It contains trace events with sequence diagram information. To parse the data using TMF a class is provided that implements ''ITmfTrace''. Additionally, a parser is provided that reads from the file and converts a trace event to ''TmfEvent''. This parser implements the interface ''ITmfEventParser''. To get the source code see [[#Downloading the Reference Plug-in | Download the Reference Plug-in]]
1188<br>
1189The plug-in structure will look like this:<br>
1190[[Image:images/ReferencePlugin.png]]<br>
1191
1192To open the plug-in manifest, double-click on the MANIFEST.MF file. <br>
1193[[Image:images/SelectManifestRef.png]]<br>
1194
1195Run the Reference Application. To launch the Eclipse Application select the ''Overview'' tab and click on '''Launch an Eclipse Application'''<br>
1196[[Image:images/RunApplicationRef.png]]<br>
1197
1198To open the Reference Sequence Diagram View, select '''Windows -> Show View -> Other... -> TMF -> Sequence Diagram''' <br>
1199[[Image:images/ShowTmfSDView.png]]<br>
1200
fac4e45b 1201An blank Sequence Diagram View will open.
067490ab 1202
fac4e45b 1203Select the '''Select Experiment''' button of the toolbar to load the sequence diagram from the data provided in the trace file. What this does is open the file ''tracesets/sdEvents'', parse this file through TMF and analyze all events of type ''TmfEvent'' and generates the Sequence Diagram out of it. <br>
067490ab
AM
1204[[Image:images/ReferenceSeqDiagram.png]]<br>
1205
1206Now the reference application can be explored. To demonstrate the view features try the following things:
1207*Select a message in the Sequence diagram. As result the corresponding event will be selected in the Events View.
1208*Select an event in the Events View. As result the corresponding message in the Sequence Diagram View will be selected. If necessary, the page will be changed.
1209*In the Events View, press key ''End''. As result, the Sequence Diagram view will jump to the last page.
1210*In the Events View, press key ''Home''. As result, the Sequence Diagram view will jump to the first page.
1211*In the Sequence Diagram View select the find button. Enter the expression '''REGISTER.*''', select '''Search for Interaction''' and press '''Find'''. As result the corresponding message will be selected in the Sequence Diagram and the corresponding event in the Events View will be selected. Select again '''Find''' the next occurrence of will be selected. Since the second occurrence is on a different page than the first, the corresponding page will be loaded.
1212* In the Sequence Diagram View, select menu item '''Hide Patterns...'''. Add the filter '''BALL.*''' for '''Interaction''' only and select '''OK'''. As result all messages with name ''BALL_REQUEST'' and ''BALL_REPLY'' will be hidden. To remove the filter, select menu item '''Hide Patterns...''', deselect the corresponding filter and press '''OK'''. All the messages will be shown again.<br>
1213
1214To dispose the diagram, select the '''Dispose Experiment''' button of the toolbar. The current sequence diagram will be disposed and an empty diagram will be loaded.
1215
1216=== Extending the Reference Loader ===
1217
1218In some case it might be necessary to change the implementation of the analysis of each ''TmfEvent'' for the generation of ''Sequence Diagram Events''. For that just extend the class ''TmfUml2SDSyncLoader'' and overwrite the method ''protected ITmfSyncSequenceDiagramEvent getSequnceDiagramEvent(TmfEvent tmfEvent)'' with your own implementation.
1219
1220=== Downloading the Reference Plug-in ===
fac4e45b 1221To download the reference plug-in that demonstrates the reference loader, use the following link: [http://wiki.eclipse.org/images/d/d3/ReferencePlugin.zip Reference Plug-in]. Just extract the zip file and import the extracted Eclipse plug-in (plug-in name: ''org.eclipse.linuxtools.tmf.reference.ui'') to your Eclipse workspace. <br>
067490ab 1222
f5b8868d
MAL
1223= View Tutorial =
1224
1225This tutorial describes how to create a simple view using the TMF framework and the SWTChart library. SWTChart is a library based on SWT that can draw several types of charts including a line chart which we will use in this tutorial. We will create a view containing a line chart that displays time stamps on the X axis and the corresponding event values on the Y axis.
1226
1227This tutorial will cover concepts like:
1228
1229* Extending TmfView
1230* Signal handling (@TmfSignalHandler)
1231* Data requests (TmfEventRequest)
1232* SWTChart integration
1233
1234=== Prerequisites ===
1235
1236The tutorial is based on Eclipse 4.3 (Eclipse Kepler), TMF 2.0.0 and SWTChart 0.7.0. You can install SWTChart by using the Orbit update site. http://download.eclipse.org/tools/orbit/downloads/
1237
1238=== Creating an Eclipse UI Plug-in ===
1239
1240To create a new project with name org.eclipse.linuxtools.tmf.sample.ui select '''File -> New -> Project -> Plug-in Development -> Plug-in Project'''. <br>
1241[[Image:images/Screenshot-NewPlug-inProject1.png]]<br>
1242
1243[[Image:images/Screenshot-NewPlug-inProject2.png]]<br>
1244
1245[[Image:images/Screenshot-NewPlug-inProject3.png]]<br>
1246
1247=== Creating a View ===
1248
1249To open the plug-in manifest, double-click on the MANIFEST.MF file. <br>
1250[[Image:images/SelectManifest.png]]<br>
1251
1252Change to the Dependencies tab and select '''Add...''' of the ''Required Plug-ins'' section. A new dialog box will open. Next find plug-in ''org.eclipse.linuxtools.tmf.core'' and press '''OK'''<br>
1253Following the same steps, add ''org.eclipse.linuxtools.tmf.ui'' and ''org.swtchart''.<br>
1254[[Image:images/AddDependencyTmfUi.png]]<br>
1255
1256Change to the Extensions tab and select '''Add...''' of the ''All Extension'' section. A new dialog box will open. Find the view extension ''org.eclipse.ui.views'' and press '''Finish'''.<br>
1257[[Image:images/AddViewExtension1.png]]<br>
1258
1259To create a view, click the right mouse button. Then select '''New -> view'''<br>
1260[[Image:images/AddViewExtension2.png]]<br>
1261
1262A new view entry has been created. Fill in the fields ''id'' and ''name''. For ''class'' click on the '''class hyperlink''' and it will show the New Java Class dialog. Enter the name ''SampleView'', change the superclass to ''TmfView'' and click Finish. This will create the source file and fill the ''class'' field in the process. We use TmfView as the superclass because it provides extra functionality like getting the active trace, pinning and it has support for signal handling between components.<br>
1263[[Image:images/FillSampleViewExtension.png]]<br>
1264
1265This will generate an empty class. Once the quick fixes are applied, the following code is obtained:
1266
1267<pre>
1268package org.eclipse.linuxtools.tmf.sample.ui;
1269
1270import org.eclipse.swt.widgets.Composite;
1271import org.eclipse.ui.part.ViewPart;
1272
1273public class SampleView extends TmfView {
1274
1275 public SampleView(String viewName) {
1276 super(viewName);
1277 // TODO Auto-generated constructor stub
1278 }
1279
1280 @Override
1281 public void createPartControl(Composite parent) {
1282 // TODO Auto-generated method stub
1283
1284 }
1285
1286 @Override
1287 public void setFocus() {
1288 // TODO Auto-generated method stub
1289
1290 }
1291
1292}
1293</pre>
1294
1295This creates an empty view, however the basic structure is now is place.
1296
1297===Implementing a view===
1298
1299We will start by adding a empty chart then it will need to be populated with the trace data. Finally, we will make the chart more visually pleasing by adjusting the range and formating the time stamps.
1300
1301====Adding an Empty Chart====
1302
1303First, we can add an empty chart to the view and initialize some of its components.
1304
1305<pre>
1306 private static final String SERIES_NAME = "Series";
1307 private static final String Y_AXIS_TITLE = "Signal";
1308 private static final String X_AXIS_TITLE = "Time";
1309 private static final String FIELD = "value"; // The name of the field that we want to display on the Y axis
1310 private static final String VIEW_ID = "org.eclipse.linuxtools.tmf.sample.ui.view";
1311 private Chart chart;
1312 private ITmfTrace currentTrace;
1313
1314 public SampleView() {
1315 super(VIEW_ID);
1316 }
1317
1318 @Override
1319 public void createPartControl(Composite parent) {
1320 chart = new Chart(parent, SWT.BORDER);
1321 chart.getTitle().setVisible(false);
1322 chart.getAxisSet().getXAxis(0).getTitle().setText(X_AXIS_TITLE);
1323 chart.getAxisSet().getYAxis(0).getTitle().setText(Y_AXIS_TITLE);
1324 chart.getSeriesSet().createSeries(SeriesType.LINE, SERIES_NAME);
1325 chart.getLegend().setVisible(false);
1326 }
1327
1328 @Override
1329 public void setFocus() {
1330 chart.setFocus();
1331 }
1332</pre>
1333
1334The view is prepared. Run the Example. To launch the an Eclipse Application select the ''Overview'' tab and click on '''Launch an Eclipse Application'''<br>
1335[[Image:images/RunEclipseApplication.png]]<br>
1336
1337A new Eclipse application window will show. In the new window go to '''Windows -> Show View -> Other... -> Other -> Sample View'''.<br>
1338[[Image:images/ShowViewOther.png]]<br>
1339
1340You should now see a view containing an empty chart<br>
1341[[Image:images/EmptySampleView.png]]<br>
1342
1343====Signal Handling====
1344
1345We would like to populate the view when a trace is selected. To achieve this, we can use a signal hander which is specified with the '''@TmfSignalHandler''' annotation.
1346
1347<pre>
1348 @TmfSignalHandler
1349 public void traceSelected(final TmfTraceSelectedSignal signal) {
1350
1351 }
1352</pre>
1353
1354====Requesting Data====
1355
1356Then we need to actually gather data from the trace. This is done asynchronously using a ''TmfEventRequest''
1357
1358<pre>
1359 @TmfSignalHandler
1360 public void traceSelected(final TmfTraceSelectedSignal signal) {
1361 // Don't populate the view again if we're already showing this trace
1362 if (currentTrace == signal.getTrace()) {
1363 return;
1364 }
1365 currentTrace = signal.getTrace();
1366
1367 // Create the request to get data from the trace
1368
1369 TmfEventRequest req = new TmfEventRequest(TmfEvent.class,
1370 TmfTimeRange.ETERNITY, TmfEventRequest.ALL_DATA,
1371 ExecutionType.BACKGROUND) {
1372
1373 @Override
1374 public void handleData(ITmfEvent data) {
1375 // Called for each event
1376 super.handleData(data);
1377 }
1378
1379 @Override
1380 public void handleSuccess() {
1381 // Request successful, not more data available
1382 super.handleSuccess();
1383 }
1384
1385 @Override
1386 public void handleFailure() {
1387 // Request failed, not more data available
1388 super.handleFailure();
1389 }
1390 };
1391 ITmfTrace trace = signal.getTrace();
1392 trace.sendRequest(req);
1393 }
1394</pre>
1395
1396====Transferring Data to the Chart====
1397
1398The chart expects an array of doubles for both the X and Y axis values. To provide that, we can accumulate each event's time and value in their respective list then convert the list to arrays when all events are processed.
1399
1400<pre>
1401 TmfEventRequest req = new TmfEventRequest(TmfEvent.class,
1402 TmfTimeRange.ETERNITY, TmfEventRequest.ALL_DATA,
1403 ExecutionType.BACKGROUND) {
1404
1405 ArrayList<Double> xValues = new ArrayList<Double>();
1406 ArrayList<Double> yValues = new ArrayList<Double>();
1407
1408 @Override
1409 public void handleData(ITmfEvent data) {
1410 // Called for each event
1411 super.handleData(data);
1412 ITmfEventField field = data.getContent().getField(FIELD);
1413 if (field != null) {
1414 yValues.add((Double) field.getValue());
1415 xValues.add((double) data.getTimestamp().getValue());
1416 }
1417 }
1418
1419 @Override
1420 public void handleSuccess() {
1421 // Request successful, not more data available
1422 super.handleSuccess();
1423
1424 final double x[] = toArray(xValues);
1425 final double y[] = toArray(yValues);
1426
1427 // This part needs to run on the UI thread since it updates the chart SWT control
1428 Display.getDefault().asyncExec(new Runnable() {
1429
1430 @Override
1431 public void run() {
1432 chart.getSeriesSet().getSeries()[0].setXSeries(x);
1433 chart.getSeriesSet().getSeries()[0].setYSeries(y);
1434
1435 chart.redraw();
1436 }
1437
1438 });
1439 }
1440
1441 /**
1442 * Convert List<Double> to double[]
1443 */
1444 private double[] toArray(List<Double> list) {
1445 double[] d = new double[list.size()];
1446 for (int i = 0; i < list.size(); ++i) {
1447 d[i] = list.get(i);
1448 }
1449
1450 return d;
1451 }
1452 };
1453</pre>
1454
1455====Adjusting the Range====
1456
1457The chart now contains values but they might be out of range and not visible. We can adjust the range of each axis by computing the minimum and maximum values as we add events.
1458
1459<pre>
1460
1461 ArrayList<Double> xValues = new ArrayList<Double>();
1462 ArrayList<Double> yValues = new ArrayList<Double>();
1463 private double maxY = -Double.MAX_VALUE;
1464 private double minY = Double.MAX_VALUE;
1465 private double maxX = -Double.MAX_VALUE;
1466 private double minX = Double.MAX_VALUE;
1467
1468 @Override
1469 public void handleData(ITmfEvent data) {
1470 super.handleData(data);
1471 ITmfEventField field = data.getContent().getField(FIELD);
1472 if (field != null) {
1473 Double yValue = (Double) field.getValue();
1474 minY = Math.min(minY, yValue);
1475 maxY = Math.max(maxY, yValue);
1476 yValues.add(yValue);
1477
1478 double xValue = (double) data.getTimestamp().getValue();
1479 xValues.add(xValue);
1480 minX = Math.min(minX, xValue);
1481 maxX = Math.max(maxX, xValue);
1482 }
1483 }
1484
1485 @Override
1486 public void handleSuccess() {
1487 super.handleSuccess();
1488 final double x[] = toArray(xValues);
1489 final double y[] = toArray(yValues);
1490
1491 // This part needs to run on the UI thread since it updates the chart SWT control
1492 Display.getDefault().asyncExec(new Runnable() {
1493
1494 @Override
1495 public void run() {
1496 chart.getSeriesSet().getSeries()[0].setXSeries(x);
1497 chart.getSeriesSet().getSeries()[0].setYSeries(y);
1498
1499 // Set the new range
1500 if (!xValues.isEmpty() && !yValues.isEmpty()) {
1501 chart.getAxisSet().getXAxis(0).setRange(new Range(0, x[x.length - 1]));
1502 chart.getAxisSet().getYAxis(0).setRange(new Range(minY, maxY));
1503 } else {
1504 chart.getAxisSet().getXAxis(0).setRange(new Range(0, 1));
1505 chart.getAxisSet().getYAxis(0).setRange(new Range(0, 1));
1506 }
1507 chart.getAxisSet().adjustRange();
1508
1509 chart.redraw();
1510 }
1511 });
1512 }
1513</pre>
1514
1515====Formatting the Time Stamps====
1516
1517To display the time stamps on the X axis nicely, we need to specify a format or else the time stamps will be displayed as ''long''. We use TmfTimestampFormat to make it consistent with the other TMF views. We also need to handle the '''TmfTimestampFormatUpdateSignal''' to make sure that the time stamps update when the preferences change.
1518
1519<pre>
1520 @Override
1521 public void createPartControl(Composite parent) {
1522 ...
1523
1524 chart.getAxisSet().getXAxis(0).getTick().setFormat(new TmfChartTimeStampFormat());
1525 }
1526
1527 public class TmfChartTimeStampFormat extends SimpleDateFormat {
1528 private static final long serialVersionUID = 1L;
1529 @Override
1530 public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
1531 long time = date.getTime();
1532 toAppendTo.append(TmfTimestampFormat.getDefaulTimeFormat().format(time));
1533 return toAppendTo;
1534 }
1535 }
1536
1537 @TmfSignalHandler
1538 public void timestampFormatUpdated(TmfTimestampFormatUpdateSignal signal) {
1539 // Called when the time stamp preference is changed
1540 chart.getAxisSet().getXAxis(0).getTick().setFormat(new TmfChartTimeStampFormat());
1541 chart.redraw();
1542 }
1543</pre>
1544
1545We also need to populate the view when a trace is already selected and the view is opened. We can reuse the same code by having the view send the '''TmfTraceSelectedSignal''' to itself.
1546
1547<pre>
1548 @Override
1549 public void createPartControl(Composite parent) {
1550 ...
1551
1552 ITmfTrace trace = getActiveTrace();
1553 if (trace != null) {
1554 traceSelected(new TmfTraceSelectedSignal(this, trace));
1555 }
1556 }
1557</pre>
1558
1559The view is now ready but we need a proper trace to test it. For this example, a trace was generated using LTTng-UST so that it would produce a sine function.<br>
1560
1561[[Image:images/SampleView.png]]<br>
1562
1563In summary, we have implemented a simple TMF view using the SWTChart library. We made use of signals and requests to populate the view at the appropriate time and we formated the time stamps nicely. We also made sure that the time stamp format is updated when the preferences change.
1564
067490ab
AM
1565=CTF Parser=
1566
5f7ef209 1567== CTF Format ==
067490ab
AM
1568CTF is a format used to store traces. It is self defining, binary and made to be easy to write to.
1569Before going further, the full specification of the CTF file format can be found at http://www.efficios.com/ .
1570
5f7ef209 1571For the purpose of the reader some basic description will be given. A CTF trace typically is made of several files all in the same folder.
067490ab 1572
5f7ef209 1573These files can be split into two types :
067490ab
AM
1574* Metadata
1575* Event streams
5f7ef209 1576
067490ab 1577=== Metadata ===
5f7ef209 1578The metadata is either raw text or packetized text. It is tsdl encoded. it contains a description of the type of data in the event streams. It can grow over time if new events are added to a trace but it will never overwrite what is already there.
067490ab
AM
1579
1580=== Event Streams ===
5f7ef209 1581The event streams are a file per stream per cpu. These streams are binary and packet based. The streams store events and event information (ie lost events) The event data is stored in headers and field payloads.
067490ab
AM
1582
1583So if you have two streams (channels) "channel1" and "channel2" and 4 cores, you will have the following files in your trace directory: "channel1_0" , "channel1_1" , "channel1_2" , "channel1_3" , "channel2_0" , "channel2_1" , "channel2_2" & "channel2_3"
1584
1585== Reading a trace ==
1586In order to read a CTF trace, two steps must be done.
1587* The metadata must be read to know how to read the events.
1588* the events must be read.
1589
5f7ef209 1590The metadata is a written in a subset of the C language called TSDL. To read it, first it is depacketized (if it is not in plain text) then the raw text is parsed by an antlr grammer. The parsing is done in two phases. There is a lexer (CTFLexer.g) which separated the metatdata text into tokens. The tokens are then pattern matched using the parser (CTFParser.g) to form an AST. This AST is walked through using "IOStructGen.java" to populate streams and traces in trace parent object.
067490ab 1591
5f7ef209
MK
1592When the metadata is loaded and read, the trace object will be populated with 3 items:
1593* the event definitions available per stream: a definition is a description of the datatype.
1594* the event declarations available per stream: this will save declaration creation on a per event basis. They will all be created in advance, just not populated.
1595* the beginning of a packet index.
067490ab 1596
5f7ef209 1597Now all the trace readers for the event streams have everything they need to read a trace. They will each point to one file, and read the file from packet to packet. Everytime the trace reader changes packet, the index is updated with the new packet's information. The readers are in a priority queue and sorted by timestamp. This ensures that the events are read in a sequential order. They are also sorted by file name so that in the eventuality that two events occur at the same time, they stay in the same order.
067490ab
AM
1598
1599== Seeking in a trace ==
5f7ef209 1600The reason for maintaining an index is to speed up seeks. In the case that a user wishes to seek to a certain timestamp, they just have to find the index entry that contains the timestamp, and go there to iterate in that packet until the proper event is found. this will reduce the searches time by an order of 8000 for a 256k paket size (kernel default).
067490ab
AM
1601
1602== Interfacing to TMF ==
5f7ef209 1603The trace can be read easily now but the data is still awkward to extract.
067490ab
AM
1604
1605=== CtfLocation ===
5f7ef209 1606A location in a given trace, it is currently the timestamp of a trace and the index of the event. The index shows for a given timestamp if it is the first second or nth element.
067490ab
AM
1607
1608=== CtfTmfTrace ===
1609The CtfTmfTrace is a wrapper for the standard CTF trace that allows it to perform the following actions:
5f7ef209
MK
1610* '''initTrace()''' create a trace
1611* '''validateTrace()''' is the trace a CTF trace?
1612* '''getLocationRatio()''' how far in the trace is my location?
1613* '''seekEvent()''' sets the cursor to a certain point in a trace.
1614* '''readNextEvent()''' reads the next event and then advances the cursor
1615* '''getTraceProperties()''' gets the 'env' structures of the metadata
067490ab
AM
1616
1617=== CtfIterator ===
1618The CtfIterator is a wrapper to the CTF file reader. It behaves like an iterator on a trace. However, it contains a file pointer and thus cannot be duplicated too often or the system will run out of file handles. To alleviate the situation, a pool of iterators is created at the very beginning and stored in the CtfTmfTrace. They can be retried by calling the GetIterator() method.
1619
5f7ef209
MK
1620=== CtfIteratorManager ===
1621Since each CtfIterator will have a file reader, the OS will run out of handles if too many iterators are spawned. The solution is to use the iterator manager. This will allow the user to get an iterator. If there is a context at the requested position, the manager will return that one, if not, a context will be selected at random and set to the correct location. Using random replacement minimizes contention as it will settle quickly at a new balance point.
1622
1623=== CtfTmfContext ===
1624The CtfTmfContext implements the ITmfContext type. It is the CTF equivalent of TmfContext. It has a CtfLocation and points to an iterator in the CtfTmfTrace iterator pool as well as the parent trace. it is made to be cloned easily and not affect system resources much. Contexts behave much like C file pointers (FILE*) but they can be copied until one runs out of RAM.
067490ab
AM
1625
1626=== CtfTmfTimestamp ===
1627The CtfTmfTimestamp take a CTF time (normally a long int) and outputs the time formats it as a TmfTimestamp, allowing it to be compared to other timestamps. The time is stored with the UTC offset already applied. It also features a simple toString() function that allows it to output the time in more Human readable ways: "yyyy/mm/dd/hh:mm:ss.nnnnnnnnn ns" for example. An additional feature is the getDelta() function that allows two timestamps to be substracted, showing the time difference between A and B.
1628
1629=== CtfTmfEvent ===
5f7ef209 1630The CtfTmfEvent is an ITmfEvent that is used to wrap event declarations and event definitions from the CTF side into easier to read and parse chunks of information. It is a final class with final fields made to be newed very often without incurring performance costs. Most of the information is already available. It should be noted that one type of event can appear called "lost event" these are synthetic events that do not exist in the trace. They will not appear in other trace readers such as babeltrace.
067490ab
AM
1631
1632=== Other ===
5f7ef209 1633There are other helper files that format given events for views, they are simpler and the architecture does not depend on them.
067490ab
AM
1634
1635=== Limitations ===
1636For the moment live trace reading is not supported, there are no sources of traces to test on.
This page took 0.245593 seconds and 5 git commands to generate.