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