lttng: Split UST event names in a separate interface
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.ust.core / src / org / eclipse / tracecompass / internal / lttng2 / ust / core / analysis / memory / UstMemoryStateProvider.java
CommitLineData
2237fe8a 1/**********************************************************************
ed902a2b 2 * Copyright (c) 2014, 2015 Ericsson, École Polytechnique de Montréal
2237fe8a
GB
3 *
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
8 *
9 * Contributors:
10 * Matthew Khouzam - Initial API and implementation
11 * Geneviève Bastien - Memory is per thread and only total is kept
12 **********************************************************************/
13
116738ad 14package org.eclipse.tracecompass.internal.lttng2.ust.core.analysis.memory;
2237fe8a 15
d0c7e4ba
AM
16import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
17
2237fe8a
GB
18import java.util.HashMap;
19import java.util.Map;
20
d0c7e4ba 21import org.eclipse.jdt.annotation.NonNull;
82629c00 22import org.eclipse.tracecompass.internal.lttng2.ust.core.LttngUstEventStrings;
9bc60be7 23import org.eclipse.tracecompass.lttng2.ust.core.trace.LttngUstTrace;
d0c7e4ba 24import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
e894a508
AM
25import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
26import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
27import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
28import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
29import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
2bdf0193
AM
30import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
31import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
32import org.eclipse.tracecompass.tmf.core.statesystem.AbstractTmfStateProvider;
33import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
2237fe8a
GB
34
35/**
36 * State provider to track the memory of the threads using the UST libc wrapper
37 * memory events.
38 *
39 * @author Matthew Khouzam
40 * @author Geneviève Bastien
41 */
116738ad 42public class UstMemoryStateProvider extends AbstractTmfStateProvider {
2237fe8a
GB
43
44 /* Version of this state provider */
45 private static final int VERSION = 1;
46
47 /* Maps a pointer to a memory zone to the size of the memory */
48 private final Map<Long, Long> fMemory = new HashMap<>();
49
50 private static final Long MINUS_ONE = Long.valueOf(-1);
51 private static final Long ZERO = Long.valueOf(0);
52 private static final String EMPTY_STRING = ""; //$NON-NLS-1$
53
54 /**
55 * Constructor
56 *
57 * @param trace
58 * trace
59 */
116738ad 60 public UstMemoryStateProvider(@NonNull LttngUstTrace trace) {
e2bcc8a5 61 super(trace, "Ust:Memory"); //$NON-NLS-1$
2237fe8a
GB
62 }
63
64 @Override
65 protected void eventHandle(ITmfEvent event) {
578716e6 66 String name = event.getName();
2237fe8a 67 switch (name) {
82629c00
AM
68 case LttngUstEventStrings.MALLOC: {
69 Long ptr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_PTR).getValue();
2237fe8a
GB
70 if (ZERO.equals(ptr)) {
71 return;
72 }
82629c00 73 Long size = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_SIZE).getValue();
2237fe8a
GB
74 setMem(event, ptr, size);
75 }
76 break;
82629c00
AM
77 case LttngUstEventStrings.FREE: {
78 Long ptr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_PTR).getValue();
2237fe8a
GB
79 if (ZERO.equals(ptr)) {
80 return;
81 }
82 setMem(event, ptr, ZERO);
83 }
84 break;
82629c00
AM
85 case LttngUstEventStrings.CALLOC: {
86 Long ptr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_PTR).getValue();
2237fe8a
GB
87 if (ZERO.equals(ptr)) {
88 return;
89 }
82629c00
AM
90 Long nmemb = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_NMEMB).getValue();
91 Long size = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_SIZE).getValue();
2237fe8a
GB
92 setMem(event, ptr, size * nmemb);
93 }
94 break;
82629c00
AM
95 case LttngUstEventStrings.REALLOC: {
96 Long ptr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_PTR).getValue();
2237fe8a
GB
97 if (ZERO.equals(ptr)) {
98 return;
99 }
82629c00
AM
100 Long newPtr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_INPTR).getValue();
101 Long size = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_SIZE).getValue();
2237fe8a
GB
102 setMem(event, ptr, ZERO);
103 setMem(event, newPtr, size);
104 }
105 break;
82629c00
AM
106 case LttngUstEventStrings.MEMALIGN: {
107 Long ptr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_PTR).getValue();
2237fe8a
GB
108 if (ZERO.equals(ptr)) {
109 return;
110 }
82629c00 111 Long size = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_SIZE).getValue();
2237fe8a
GB
112 setMem(event, ptr, size);
113 }
114 break;
82629c00
AM
115 case LttngUstEventStrings.POSIX_MEMALIGN: {
116 Long ptr = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_OUTPTR).getValue();
2237fe8a
GB
117 if (ZERO.equals(ptr)) {
118 return;
119 }
82629c00 120 Long size = (Long) event.getContent().getField(LttngUstEventStrings.FIELD_SIZE).getValue();
2237fe8a
GB
121 setMem(event, ptr, size);
122 }
123 break;
124 default:
125 break;
126 }
127
128 }
129
130 @Override
131 public ITmfStateProvider getNewInstance() {
116738ad 132 return new UstMemoryStateProvider(getTrace());
2237fe8a
GB
133 }
134
135 @Override
136 public LttngUstTrace getTrace() {
137 return (LttngUstTrace) super.getTrace();
138 }
139
140 @Override
141 public int getVersion() {
142 return VERSION;
143 }
144
145 private static Long getVtid(ITmfEvent event) {
82629c00 146 ITmfEventField field = event.getContent().getField(LttngUstEventStrings.CONTEXT_VTID);
2237fe8a
GB
147 if (field == null) {
148 return MINUS_ONE;
149 }
150 return (Long) field.getValue();
151 }
152
153 private static String getProcname(ITmfEvent event) {
82629c00 154 ITmfEventField field = event.getContent().getField(LttngUstEventStrings.CONTEXT_PROCNAME);
2237fe8a
GB
155 if (field == null) {
156 return EMPTY_STRING;
157 }
158 return (String) field.getValue();
159 }
160
161 private void setMem(ITmfEvent event, Long ptr, Long size) {
d0c7e4ba 162 ITmfStateSystemBuilder ss = checkNotNull(getStateSystemBuilder());
2237fe8a
GB
163 long ts = event.getTimestamp().getValue();
164 Long tid = getVtid(event);
165
166 Long memoryDiff = size;
167 /* Size is 0, it means it was deleted */
168 if (ZERO.equals(size)) {
169 Long memSize = fMemory.remove(ptr);
170 if (memSize == null) {
171 return;
172 }
173 memoryDiff = -memSize;
174 } else {
175 fMemory.put(ptr, size);
176 }
177 try {
178 int tidQuark = ss.getQuarkAbsoluteAndAdd(tid.toString());
179 int tidMemQuark = ss.getQuarkRelativeAndAdd(tidQuark, UstMemoryStrings.UST_MEMORY_MEMORY_ATTRIBUTE);
180
181 ITmfStateValue prevMem = ss.queryOngoingState(tidMemQuark);
182 /* First time we set this value */
183 if (prevMem.isNull()) {
184 int procNameQuark = ss.getQuarkRelativeAndAdd(tidQuark, UstMemoryStrings.UST_MEMORY_PROCNAME_ATTRIBUTE);
185 String procName = getProcname(event);
186 /*
187 * No tid/procname for the event for the event, added to a
188 * 'others' thread
189 */
190 if (tid.equals(MINUS_ONE)) {
191 procName = UstMemoryStrings.OTHERS;
192 }
193 ss.modifyAttribute(ts, TmfStateValue.newValueString(procName), procNameQuark);
194 prevMem = TmfStateValue.newValueLong(0);
195 }
196
197 long prevMemValue = prevMem.unboxLong();
198 prevMemValue += memoryDiff.longValue();
199 ss.modifyAttribute(ts, TmfStateValue.newValueLong(prevMemValue), tidMemQuark);
200 } catch (AttributeNotFoundException | TimeRangeException | StateValueTypeException e) {
201 throw new IllegalStateException(e);
202 }
203 }
204
205}
This page took 0.061159 seconds and 5 git commands to generate.