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