Commit | Line | Data |
---|---|---|
efc403bb AM |
1 | /******************************************************************************* |
2 | * Copyright (c) 2012 Ericsson | |
3 | * Copyright (c) 2010, 2011 École Polytechnique de Montréal | |
4 | * Copyright (c) 2010, 2011 Alexandre Montplaisir <alexandre.montplaisir@gmail.com> | |
5 | * | |
6 | * All rights reserved. This program and the accompanying materials are | |
7 | * made available under the terms of the Eclipse Public License v1.0 which | |
8 | * accompanies this distribution, and is available at | |
9 | * http://www.eclipse.org/legal/epl-v10.html | |
10 | * | |
11 | *******************************************************************************/ | |
12 | ||
13 | package org.eclipse.linuxtools.internal.lttng2.kernel.core.stateprovider; | |
14 | ||
15 | import java.io.IOException; | |
16 | import java.util.concurrent.ArrayBlockingQueue; | |
17 | import java.util.concurrent.BlockingQueue; | |
18 | ||
19 | import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfIterator; | |
20 | import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfEvent; | |
21 | import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTrace; | |
22 | import org.eclipse.linuxtools.tmf.core.statesystem.StateSystem; | |
23 | import org.eclipse.linuxtools.tmf.core.statesystem.helpers.IStateChangeInput; | |
24 | ||
25 | /** | |
26 | * This is the state change input plugin for TMF's state system which handles | |
27 | * the LTTng 2.0 kernel traces in CTF format. | |
28 | * | |
29 | * It uses the reference handler defined in CTFKernelHandler.java. | |
30 | * | |
31 | * @author alexmont | |
32 | * | |
33 | */ | |
34 | public class CTFKernelStateInput implements IStateChangeInput { | |
35 | ||
36 | final static int EVENTS_QUEUE_SIZE = 10000; | |
37 | ||
38 | private final BlockingQueue<CtfTmfEvent> eventsQueue; | |
39 | ||
40 | private final CtfIterator traceReader; | |
41 | private final CTFKernelHandler eventHandler; | |
42 | ||
43 | private final Thread eventHandlerThread; | |
44 | ||
45 | private boolean ssAssigned; | |
46 | ||
47 | /** | |
48 | * Instantiate a new state provider plugin. | |
49 | * | |
50 | * @param traceFile | |
51 | * The LTTng 2.0 kernel trace directory | |
52 | * @throws IOException | |
53 | * If the directory was not found, or not recognized as a CTF | |
54 | * trace. | |
55 | */ | |
56 | public CTFKernelStateInput(CtfTmfTrace trace) { | |
57 | eventsQueue = new ArrayBlockingQueue<CtfTmfEvent>(EVENTS_QUEUE_SIZE); | |
58 | traceReader = new CtfIterator(trace); | |
59 | eventHandler = new CTFKernelHandler(eventsQueue); | |
60 | ssAssigned = false; | |
61 | ||
62 | eventHandlerThread = new Thread(eventHandler, | |
63 | "CTF Kernel Event Handler"); //$NON-NLS-1$ | |
64 | } | |
65 | ||
66 | @Override | |
67 | public void run() { | |
68 | if (!ssAssigned) { | |
69 | System.err.println("Cannot start Input thread without a target state system"); //$NON-NLS-1$ | |
70 | return; | |
71 | } | |
72 | ||
73 | CtfTmfEvent currentEvent; | |
74 | ||
75 | eventHandlerThread.start(); | |
76 | ||
77 | try { | |
78 | currentEvent = traceReader.getCurrentEvent(); | |
79 | while (currentEvent != null) { | |
80 | traceReader.advance(); | |
81 | eventsQueue.put(currentEvent); | |
82 | currentEvent = traceReader.getCurrentEvent(); | |
83 | } | |
84 | /* | |
85 | * We're done reading the trace, insert a null event in the queue to | |
86 | * stop the handler | |
87 | */ | |
88 | eventsQueue.put(CtfTmfEvent.getNullEvent()); | |
89 | eventHandlerThread.join(); | |
90 | ||
91 | } catch (InterruptedException e) { | |
92 | e.printStackTrace(); | |
93 | } | |
94 | } | |
95 | ||
96 | @Override | |
97 | public void assignTargetStateSystem(StateSystem ss) { | |
98 | eventHandler.assignStateSystem(ss); | |
99 | ssAssigned = true; | |
100 | } | |
101 | ||
102 | @Override | |
103 | public StateSystem getStateSystem() { | |
104 | return eventHandler.getStateSystem(); | |
105 | } | |
106 | ||
107 | @Override | |
108 | public long getStartTime() { | |
109 | return traceReader.getCtfTmfTrace().getStartTime().getValue(); | |
110 | } | |
111 | } |