1 /*******************************************************************************
2 * Copyright (c) 2011 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Polytechnique Montréal - Initial API and implementation
11 * Bernd Hufmann - Productification, enhancements and fixes
13 *******************************************************************************/
14 package org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.subsystems
;
17 import java
.util
.ArrayList
;
18 import java
.util
.Arrays
;
19 import java
.util
.Vector
;
20 import java
.util
.concurrent
.TimeUnit
;
22 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
23 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
24 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.LttngConstants
;
25 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.ProviderResource
;
26 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.TargetResource
;
27 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.TraceResource
;
28 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.TraceResource
.TraceState
;
29 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.config
.TraceConfig
;
30 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.service
.ILttControllerService
;
31 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.service
.LttControllerServiceProxy
;
32 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.utility
.LiveTraceManager
;
33 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.Messages
;
34 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.TraceControlConstants
;
35 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.actions
.ImportToProject
;
36 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.actions
.PauseTrace
;
37 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.connectorservice
.TraceConnectorService
;
38 import org
.eclipse
.linuxtools
.lttng
.ui
.Activator
;
39 import org
.eclipse
.rse
.core
.events
.ISystemResourceChangeEvents
;
40 import org
.eclipse
.rse
.core
.events
.SystemResourceChangeEvent
;
41 import org
.eclipse
.rse
.core
.filters
.ISystemFilter
;
42 import org
.eclipse
.rse
.core
.filters
.ISystemFilterPoolReference
;
43 import org
.eclipse
.rse
.core
.model
.IHost
;
44 import org
.eclipse
.rse
.core
.model
.ISystemMessageObject
;
45 import org
.eclipse
.rse
.core
.model
.ISystemRegistry
;
46 import org
.eclipse
.rse
.core
.model
.SystemMessageObject
;
47 import org
.eclipse
.rse
.core
.model
.SystemStartHere
;
48 import org
.eclipse
.rse
.core
.subsystems
.CommunicationsEvent
;
49 import org
.eclipse
.rse
.core
.subsystems
.ICommunicationsListener
;
50 import org
.eclipse
.rse
.core
.subsystems
.IConnectorService
;
51 import org
.eclipse
.rse
.core
.subsystems
.SubSystem
;
52 import org
.eclipse
.rse
.services
.clientserver
.NamePatternMatcher
;
53 import org
.eclipse
.rse
.services
.clientserver
.messages
.SystemMessageException
;
54 import org
.eclipse
.rse
.ui
.SystemBasePlugin
;
55 import org
.eclipse
.swt
.widgets
.Display
;
56 import org
.eclipse
.tm
.tcf
.protocol
.IToken
;
57 import org
.eclipse
.tm
.tcf
.util
.TCFTask
;
60 * <b><u>TraceSubSystem</u></b>
62 * Implementation of the trace subsystem. Provides methods to initialize connections
63 * to the remote system, connection handling, filtering and retrival of remote
64 * system configuration.
67 public class TraceSubSystem
extends SubSystem
implements ICommunicationsListener
{
69 // ------------------------------------------------------------------------
71 // ------------------------------------------------------------------------
73 private ProviderResource
[] fProviders
; // master list of Providers
75 // ------------------------------------------------------------------------
77 // ------------------------------------------------------------------------
80 * @param connectorService
82 public TraceSubSystem(IHost host
, IConnectorService connectorService
) {
83 super(host
, connectorService
);
86 // ------------------------------------------------------------------------
88 // ------------------------------------------------------------------------
92 * @see org.eclipse.rse.core.subsystems.SubSystem#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
95 public void initializeSubSystem(IProgressMonitor monitor
) {
96 getConnectorService().addCommunicationsListener(this);
101 * @see org.eclipse.rse.core.subsystems.SubSystem#uninitializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
104 public void uninitializeSubSystem(IProgressMonitor monitor
) {
109 * @see org.eclipse.rse.core.subsystems.SubSystem#getObjectWithAbsoluteName(java.lang.String)
111 * For drag and drop, and clipboard support of remote objects.
113 * Return the remote object within the subsystem that corresponds to the specified unique ID. Because each subsystem maintains it's own objects, it's the responsability of the subsystem to determine how an ID (or key) for a given object maps to
114 * the real object. By default this returns null.
117 public Object
getObjectWithAbsoluteName(String key
) {
123 * @see org.eclipse.rse.core.subsystems.SubSystem#internalResolveFilterString(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
126 protected Object
[] internalResolveFilterString(String filterString
, IProgressMonitor monitor
) throws java
.lang
.reflect
.InvocationTargetException
, java
.lang
.InterruptedException
{
128 ProviderResource
[] allProviders
;
131 allProviders
= getAllProviders();
132 } catch (SystemMessageException e
) {
133 SystemBasePlugin
.logError("TraceSubSystem", e
); //$NON-NLS-1$
134 Object
[] children
= new SystemMessageObject
[1];
135 children
[0] = new SystemMessageObject(e
.getSystemMessage(), ISystemMessageObject
.MSGTYPE_ERROR
, null);
139 // Now, subset master list, based on filter string...
140 NamePatternMatcher subsetter
= new NamePatternMatcher(filterString
);
141 Vector
<ProviderResource
> v
= new Vector
<ProviderResource
>();
142 for (int idx
= 0; idx
< allProviders
.length
; idx
++) {
143 if (subsetter
.matches(allProviders
[idx
].getName())) {
144 v
.addElement(allProviders
[idx
]);
151 * @see org.eclipse.rse.core.subsystems.SubSystem#internalResolveFilterString(java.lang.Object, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
154 protected Object
[] internalResolveFilterString(Object parent
, String filterString
, IProgressMonitor monitor
) throws java
.lang
.reflect
.InvocationTargetException
, java
.lang
.InterruptedException
{
159 * @see org.eclipse.rse.core.subsystems.SubSystem#filterEventFilterCreated(java.lang.Object, org.eclipse.rse.core.filters.ISystemFilter)
162 public void filterEventFilterCreated(Object selectedObject
, ISystemFilter newFilter
) {
163 super.filterEventFilterCreated(selectedObject
, newFilter
);
164 ISystemRegistry registry
= SystemStartHere
.getSystemRegistry();
165 registry
.fireEvent(new SystemResourceChangeEvent(this, ISystemResourceChangeEvents
.EVENT_REFRESH
, null));
169 * @see org.eclipse.rse.core.subsystems.SubSystem#filterEventFilterPoolReferenceCreated(org.eclipse.rse.core.filters.ISystemFilterPoolReference)
172 public void filterEventFilterPoolReferenceCreated(ISystemFilterPoolReference newPoolRef
) {
173 super.filterEventFilterPoolReferenceCreated(newPoolRef
);
174 if (getSystemFilterPoolReferenceManager().getSystemFilterPoolReferenceCount() == 1) {
175 ISystemRegistry registry
= SystemStartHere
.getSystemRegistry();
176 registry
.fireEvent(new SystemResourceChangeEvent(this, ISystemResourceChangeEvents
.EVENT_REFRESH
, null));
181 * Retrieves all provider resources from the remote system and updates local references.
183 * @return provider resources
184 * @throws SystemMessageException
185 * @throws InterruptedException
187 public ProviderResource
[] getAllProviders() throws SystemMessageException
, InterruptedException
{
188 ProviderResource
[] providers
= createProviders();
189 if (fProviders
== null) {
190 fProviders
= providers
;
193 for (int i
= 0; i
< fProviders
.length
; i
++) {
194 for (int j
= 0; j
< providers
.length
; j
++) {
195 if(fProviders
[i
].getName().equals(providers
[j
].getName())) {
196 // Check if all targets already exist
197 fProviders
[i
].refreshTargets(providers
[j
].getTargets());
202 return (fProviders
!= null) ? Arrays
.copyOf(fProviders
, fProviders
.length
) : null;
206 * Get the list of all targets.
208 * @return targets The list of targets.
209 * @throws SystemMessageException
211 public TargetResource
[] getAllTargets() throws SystemMessageException
{
212 ArrayList
<TargetResource
> targets
= new ArrayList
<TargetResource
>();
213 if (fProviders
!= null) {
214 for (int i
= 0; i
< fProviders
.length
; i
++) {
215 targets
.addAll(Arrays
.asList(fProviders
[i
].getTargets()));
218 return targets
.toArray(new TargetResource
[0]);
222 * Get the list of all traces.
224 * @return traces The list of traces.
225 * @throws SystemMessageException
227 public TraceResource
[] getAllTraces() throws SystemMessageException
{
228 ArrayList
<TraceResource
> traces
= new ArrayList
<TraceResource
>();
229 if (fProviders
!= null) {
230 for (int i
= 0; i
< fProviders
.length
; i
++) {
231 ProviderResource provider
= fProviders
[i
];
232 int numTargets
= provider
.getTargets().length
;
233 for (int j
= 0; j
< numTargets
; j
++) {
234 TargetResource target
= provider
.getTargets()[j
];
235 if (provider
.getName().equals(LttngConstants
.Lttng_Provider_Kernel
)) {
236 traces
.addAll(Arrays
.asList(target
.getTraces()));
241 return traces
.toArray(new TraceResource
[0]);
245 * Get the list of all traces for given provider and target.
249 * @returns trace resources
251 public TraceResource
[] getAllTraces(String providerName
, String targetName
) throws SystemMessageException
{
252 ArrayList
<TraceResource
> traces
= new ArrayList
<TraceResource
>();
253 ProviderResource selectedProvider
= null;
254 if (fProviders
!= null) {
255 for (int i
= 0; i
< fProviders
.length
; i
++) {
256 ProviderResource provider
= fProviders
[i
];
257 if (provider
.getName().equals(providerName
)) {
258 selectedProvider
= fProviders
[i
];
263 if (selectedProvider
!= null) {
264 int numTargets
= selectedProvider
.getTargets().length
;
265 for (int j
= 0; j
< numTargets
; j
++) {
266 TargetResource target
= selectedProvider
.getTargets()[j
];
267 if (target
.getName().equals(targetName
)) {
268 traces
.addAll(Arrays
.asList(target
.getTraces()));
274 return traces
.toArray(new TraceResource
[0]);
278 * Finds a trace resource within a given provider and target for a given trace name
280 * @param targetName - target name to be searched
281 * @param traceName - trace name to be searched
282 * @return trace resource or null (if not found)
284 public TraceResource
findTrace(String providerName
, String targetName
, String traceName
) {
285 TraceResource trace
= null;
286 TraceResource
[] traces
;
288 traces
= getAllTraces(providerName
, targetName
);
289 for (int i
= 0; i
< traces
.length
; i
++) {
290 if (traces
[i
].getName().equals(traceName
)) {
295 } catch (SystemMessageException e
) {
296 SystemBasePlugin
.logError("TraceSubSystem", e
); //$NON-NLS-1$
303 * Retrieves the providers from the remote system.
305 private ProviderResource
[] createProviders() throws SystemMessageException
{
306 ProviderResource
[] providers
= null;
309 final ILttControllerService service
= getControllerService();
311 // Create future task
312 providers
= new TCFTask
<ProviderResource
[]>() {
316 // Get provider using Lttng controller service proxy
317 service
.getProviders(new ILttControllerService
.DoneGetProviders() {
320 public void doneGetProviders(IToken token
, Exception error
, String
[] str
) {
327 // Create provider list
328 ProviderResource
[] providers
= new ProviderResource
[str
.length
];
330 for (int i
= 0; i
< str
.length
; i
++) {
331 ProviderResource tempProvider
= new ProviderResource(TraceSubSystem
.this);
332 tempProvider
.setName(str
[i
]);
333 providers
[i
] = tempProvider
;
336 // Notify with provider list
340 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
341 } catch (Exception e
) {
342 if (e
instanceof SystemMessageException
) throw (SystemMessageException
)e
;
343 throw new SystemMessageException(Activator
.getDefault().getMessage(e
));
346 for (int i
= 0; i
< providers
.length
; i
++) {
347 createTargets(providers
[i
]);
354 * Retrieves the targets for given provider from the remote system.
356 private TargetResource
[] createTargets(final ProviderResource provider
) throws SystemMessageException
{
357 TargetResource
[] targets
;
359 final ILttControllerService service
= getControllerService();
361 // Create future task
362 targets
= new TCFTask
<TargetResource
[]>() {
366 // Get targets using Lttng controller service proxy
367 service
.getTargets(provider
.getName(), new ILttControllerService
.DoneGetTargets() {
370 public void doneGetTargets(IToken token
, Exception error
, String
[] str
) {
378 TargetResource
[] targets
= new TargetResource
[str
.length
];
379 for (int i
= 0; i
< str
.length
; i
++) {
380 TargetResource tempTarget
= new TargetResource(TraceSubSystem
.this);
381 tempTarget
.setName(str
[i
]);
382 tempTarget
.setParent(provider
);
383 targets
[i
] = tempTarget
;
385 // Notify with target list
389 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
390 } catch (Exception e
) {
391 provider
.setTargets(new TargetResource
[0]);
392 if (e
instanceof SystemMessageException
) throw (SystemMessageException
)e
;
393 throw new SystemMessageException(Activator
.getDefault().getMessage(e
));
396 provider
.setTargets(targets
);
397 for (int i
= 0; i
< targets
.length
; i
++) {
398 if (targets
[i
].getParent().getName().equals(LttngConstants
.Lttng_Provider_Kernel
)) {
399 createTraces(targets
[i
]);
407 * Retrieves the trace instances for a given target from the remote system.
409 private TraceResource
[] createTraces(final TargetResource target
) throws SystemMessageException
{
410 TraceResource
[] traces
;
412 final ILttControllerService service
= getControllerService();
414 // Create future task
415 traces
= new TCFTask
<TraceResource
[]>() {
418 // Get targets using Lttng controller service proxy
419 service
.getTraces(target
.getParent().getName(), target
.getName(), new ILttControllerService
.DoneGetTraces() {
422 public void doneGetTraces(IToken token
, Exception error
, String
[] str
) {
430 TraceResource
[] traces
= new TraceResource
[str
.length
];
431 for (int i
= 0; i
< str
.length
; i
++) {
432 TraceResource trace
= new TraceResource(TraceSubSystem
.this, service
);
433 trace
.setName(str
[i
]);
434 trace
.setParent(target
);
435 trace
.setTraceState(TraceState
.CREATED
);
439 // Notify with trace list
443 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
444 } catch (Exception e
) {
445 target
.setTraces(new TraceResource
[0]);
446 if (e
instanceof SystemMessageException
) throw (SystemMessageException
)e
;
447 throw new SystemMessageException(Activator
.getDefault().getMessage(e
));
450 target
.setTraces(traces
);
452 // get active trace information (is only supported for kernel traces)
453 createTraceConfigurations(target
, traces
);
458 * Retrieves the trace configurations for the given trace from the remote system.
460 private void createTraceConfigurations(final TargetResource target
, TraceResource
[] traces
) throws SystemMessageException
{
461 if (!target
.isUst() && (traces
.length
> 0)) {
463 String
[] activeTraceNames
;
465 final ILttControllerService service
= getControllerService();
466 activeTraceNames
= new TCFTask
<String
[]>() {
469 // Get targets using Lttng controller service proxy
470 service
.getActiveTraces(target
.getParent().getName(), target
.getName(), new ILttControllerService
.DoneGetActiveTraces() {
473 public void doneGetActiveTraces(IToken token
, Exception error
, String
[] str
) {
480 // Notify with active trace list
484 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
485 } catch (Exception e
) {
486 if (e
instanceof SystemMessageException
) throw (SystemMessageException
)e
;
487 throw new SystemMessageException(Activator
.getDefault().getMessage(e
));
490 // get active trace information
491 for (int j
= 0; j
< activeTraceNames
.length
; j
++) {
492 final TraceResource trace
= target
.getTrace(activeTraceNames
[j
]);
495 TraceConfig traceConfig
;
498 final ILttControllerService service
= getControllerService();
499 traceConfig
= new TCFTask
<TraceConfig
>() {
502 // Get targets using Lttng controller service proxy
503 service
.getActiveTraceInfo(target
.getParent().getName(), target
.getName(), trace
.getName(), new ILttControllerService
.DoneGetActiveTraceInfo() {
506 public void doneGetActiveTraceInfo(IToken token
, Exception error
, String
[] strArray
) {
513 TraceConfig config
= new TraceConfig();
514 config
.setTraceName(trace
.getName());
515 config
.setTraceTransport(TraceControlConstants
.Lttng_Trace_Transport_Relay
);
516 config
.setIsAppend(false);
517 for (String pair
: strArray
) {
518 String
[] pairArray
= pair
.split(LttngConstants
.Lttng_Control_GetActiveTraceInfoSeparator
);
519 if (pairArray
.length
!= 2) {
522 String param
= pairArray
[0];
523 String value
= pairArray
[1];
524 if (param
.equals(TraceControlConstants
.ACTIVE_TRACE_INFO_PARAM_DESTINATION
)) {
525 if (value
.startsWith(TraceControlConstants
.ACTIVE_TRACE_INFO_DESTINATION_PREFIX_LOCAL
)) {
526 config
.setNetworkTrace(false);
527 config
.setTracePath(value
.substring(TraceControlConstants
.ACTIVE_TRACE_INFO_DESTINATION_PREFIX_LOCAL
.length()));
528 } else if (value
.startsWith(TraceControlConstants
.ACTIVE_TRACE_INFO_DESTINATION_PREFIX_NETWORK
)) {
529 config
.setNetworkTrace(true);
530 config
.setTracePath(value
.substring(TraceControlConstants
.ACTIVE_TRACE_INFO_DESTINATION_PREFIX_NETWORK
.length()));
532 } else if (param
.equals(TraceControlConstants
.ACTIVE_TRACE_INFO_PARAM_NUM_THREAD
)) {
533 config
.setNumChannel(Integer
.valueOf(value
));
534 } else if (param
.equals(TraceControlConstants
.ACTIVE_TRACE_INFO_PARAM_NORMAL_ONLY
)) {
535 if (value
.equals(Boolean
.toString(true))) {
536 config
.setMode(TraceConfig
.NORMAL_MODE
);
538 } else if (param
.equals(TraceControlConstants
.ACTIVE_TRACE_INFO_PARAM_FLIGHT_ONLY
)) {
539 if (value
.equals(Boolean
.toString(true))) {
540 config
.setMode(TraceConfig
.FLIGHT_RECORDER_MODE
);
542 } else if (param
.equals(TraceControlConstants
.ACTIVE_TRACE_INFO_PARAM_ENABLED
)) {
543 if (value
.equals(Boolean
.toString(true))) {
544 trace
.setTraceState(TraceState
.STARTED
);
546 trace
.setTraceState(TraceState
.PAUSED
);
551 // Notify with active trace list
555 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
556 trace
.setTraceConfig(traceConfig
);
557 if (traceConfig
!= null) {
558 if (traceConfig
.isNetworkTrace()) {
559 // stop and restart the network transfer since TCF channel may be different
560 if (fProviders
== null) { // do this only on startup, not on refresh
561 restartTraceNetwork(service
, trace
, traceConfig
);
563 LiveTraceManager
.setLiveTrace(traceConfig
.getTracePath(), true);
566 } catch (Exception e
) {
567 if (e
instanceof SystemMessageException
) throw (SystemMessageException
)e
;
568 throw new SystemMessageException(Activator
.getDefault().getMessage(e
));
577 * @see org.eclipse.rse.core.subsystems.ICommunicationsListener#communicationsStateChange(org.eclipse.rse.core.subsystems.CommunicationsEvent)
580 public void communicationsStateChange(CommunicationsEvent e
) {
581 switch (e
.getState())
583 case CommunicationsEvent
.BEFORE_CONNECT
:
585 case CommunicationsEvent
.AFTER_CONNECT
:
587 case CommunicationsEvent
.BEFORE_DISCONNECT
:
590 final TraceResource
[] traces
= getAllTraces();
592 StringBuffer traceNames
= new StringBuffer(""); //$NON-NLS-1$
593 String filler
= ""; //$NON-NLS-1$
594 for (int j
= 0; j
< traces
.length
; j
++) {
595 // For network traces, ask user to pause tracing
596 if (traces
[j
].isNetworkTraceAndStarted()) {
597 traceNames
.append(filler
);
598 traceNames
.append(traces
[j
].getName());
600 filler
= ", "; //$NON-NLS-1$
602 if (!"".equals(traceNames
.toString())) { //$NON-NLS-1$
603 final String finalTraceNames
= traceNames
.toString();
604 Display
.getDefault().syncExec(new Runnable() {
608 MessageDialog
.openWarning(Display
.getDefault().getActiveShell(), Messages
.Ltt_ShutdownWarning
, Messages
.Ltt_NetworkTraceRunningWarning
+ ":\n" + finalTraceNames
); //$NON-NLS-1$
611 PauseTrace pauseAction
= new PauseTrace();
612 pauseAction
.setSelectedTraces(new ArrayList
<TraceResource
>(Arrays
.asList(traces
)));
613 pauseAction
.run(null);
615 Thread
.sleep(2000); // allow time for target to pause traces before disconnecting the channel
616 } catch (InterruptedException e
) {
623 if (fProviders
!= null) {
624 // reset all providers and it's children
625 for (int i
= 0; i
< fProviders
.length
; i
++) {
626 fProviders
[i
].removeAllTargets();
631 } catch (SystemMessageException ex
) {
632 SystemBasePlugin
.logError("TraceSubSystem", ex
); //$NON-NLS-1$
635 case CommunicationsEvent
.AFTER_DISCONNECT
:
636 getConnectorService().removeCommunicationsListener(this);
638 case CommunicationsEvent
.CONNECTION_ERROR
:
639 // TODO notify user about the lost connection ?!
640 getConnectorService().removeCommunicationsListener(this);
643 } catch (Exception e1
) {
654 * @see org.eclipse.rse.core.subsystems.ICommunicationsListener#isPassiveCommunicationsListener()
657 public boolean isPassiveCommunicationsListener() {
662 * Returns the trace controller service.
664 * @return trace controller service
667 public LttControllerServiceProxy
getControllerService() throws Exception
{
668 return ((TraceConnectorService
)getConnectorService()).getControllerService();
672 * Stop and restart the network transfer. Only normal channels are written while trace is started.
674 private void restartTraceNetwork(final ILttControllerService service
, final TraceResource trace
, final TraceConfig traceConfig
) throws Exception
{
675 File newDir
= new File(traceConfig
.getTracePath());
676 if (!newDir
.exists()) {
677 boolean created
= newDir
.mkdirs();
679 throw new Exception(Messages
.Lttng_Control_ErrorCreateTracePath
+ ": " + traceConfig
.getTracePath()); //$NON-NLS-1$
681 if (traceConfig
.getProject() != null) {
682 ImportToProject
.linkTrace(getShell(), trace
, traceConfig
.getProject(), traceConfig
.getTraceName());
686 // stop the previous lttd
687 boolean ok
= new TCFTask
<Boolean
>() {
691 // Setup trace transport using Lttng controller service proxy
692 service
.stopWriteTraceNetwork(trace
.getParent().getParent().getName(),
693 trace
.getParent().getName(),
694 traceConfig
.getTraceName(),
695 new ILttControllerService
.DoneStopWriteTraceNetwork() {
698 public void doneStopWriteTraceNetwork(IToken token
, Exception error
, Object str
) {
705 // Notify about success
709 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
715 // lttd will only perform the shutdown after stopWriteTraceNetwork
716 // when it receives the next on_read_subbuffer callback
718 if (trace
.getTraceState() == TraceState
.PAUSED
) {
719 // we need to start the trace to make sure that the network transfer is stopped
720 ok
= new TCFTask
<Boolean
>() {
725 service
.startTrace(trace
.getParent().getParent().getName(),
726 trace
.getParent().getName(),
727 traceConfig
.getTraceName(),
728 new ILttControllerService
.DoneStartTrace() {
731 public void doneStartTrace(IToken token
, Exception error
, Object str
) {
738 // Notify about success
742 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
748 trace
.setTraceState(TraceState
.STARTED
);
750 // wait for the lttd shutdown
753 // return to paused state
754 ok
= new TCFTask
<Boolean
>() {
759 service
.pauseTrace(trace
.getParent().getParent().getName(),
760 trace
.getParent().getName(),
761 traceConfig
.getTraceName(),
762 new ILttControllerService
.DonePauseTrace() {
765 public void donePauseTrace(IToken token
, Exception error
, Object str
) {
772 // Notify about success
776 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);
782 trace
.setTraceState(TraceState
.PAUSED
);
785 // wait for the lttd shutdown
790 new TCFTask
<Boolean
>() {
794 // Setup trace transport using Lttng controller service proxy
795 service
.writeTraceNetwork(trace
.getParent().getParent().getName(),
796 trace
.getParent().getName(),
797 traceConfig
.getTraceName(),
798 traceConfig
.getTracePath(),
799 traceConfig
.getNumChannel(),
800 traceConfig
.getIsAppend(),
802 true, // write only normal channels
803 new ILttControllerService
.DoneWriteTraceNetwork() {
806 public void doneWriteTraceNetwork(IToken token
, Exception error
, Object str
) {
813 // Notify about success
817 }}.get(TraceControlConstants
.DEFAULT_TCF_TASK_TIMEOUT
, TimeUnit
.SECONDS
);