/**********************************************************************
- * Copyright (c) 2014, 2015 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2014, 2016 Ericsson, École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.lttng2.ust.core.trace.LttngUstTrace;
+import org.eclipse.tracecompass.lttng2.ust.core.trace.layout.ILttngUstEventLayout;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
-import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
import org.eclipse.tracecompass.tmf.core.statesystem.AbstractTmfStateProvider;
import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
+import com.google.common.collect.ImmutableMap;
+
/**
* State provider to track the memory of the threads using the UST libc wrapper
* memory events.
/* Version of this state provider */
private static final int VERSION = 1;
- /* Maps a pointer to a memory zone to the size of the memory */
- private final Map<Long, Long> fMemory = new HashMap<>();
-
private static final Long MINUS_ONE = Long.valueOf(-1);
private static final Long ZERO = Long.valueOf(0);
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+ private static final int MALLOC_INDEX = 1;
+ private static final int FREE_INDEX = 2;
+ private static final int CALLOC_INDEX = 3;
+ private static final int REALLOC_INDEX = 4;
+ private static final int MEMALIGN_INDEX = 5;
+ private static final int POSIX_MEMALIGN_INDEX = 6;
+
+ /** Map of a pointer to a memory zone to the size of the memory */
+ private final Map<Long, Long> fMemory = new HashMap<>();
+
+ private final @NonNull ILttngUstEventLayout fLayout;
+ private final @NonNull Map<String, Integer> fEventNames;
+
/**
* Constructor
*
*/
public UstMemoryStateProvider(@NonNull LttngUstTrace trace) {
super(trace, "Ust:Memory"); //$NON-NLS-1$
+ fLayout = trace.getEventLayout();
+ fEventNames = buildEventNames(fLayout);
+ }
+
+ private static @NonNull Map<String, Integer> buildEventNames(ILttngUstEventLayout layout) {
+ ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
+ builder.put(layout.eventLibcMalloc(), MALLOC_INDEX);
+ builder.put(layout.eventLibcFree(), FREE_INDEX);
+ builder.put(layout.eventLibcCalloc(), CALLOC_INDEX);
+ builder.put(layout.eventLibcRealloc(), REALLOC_INDEX);
+ builder.put(layout.eventLibcMemalign(), MEMALIGN_INDEX);
+ builder.put(layout.eventLibcPosixMemalign(), POSIX_MEMALIGN_INDEX);
+ return builder.build();
}
@Override
protected void eventHandle(ITmfEvent event) {
String name = event.getName();
- switch (name) {
- case UstMemoryStrings.MALLOC: {
- Long ptr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_PTR).getValue();
+ Integer index = fEventNames.get(name);
+ int intIndex = (index == null ? -1 : index.intValue());
+
+ switch (intIndex) {
+ case MALLOC_INDEX: {
+ Long ptr = (Long) event.getContent().getField(fLayout.fieldPtr()).getValue();
if (ZERO.equals(ptr)) {
return;
}
- Long size = (Long) event.getContent().getField(UstMemoryStrings.FIELD_SIZE).getValue();
+ Long size = (Long) event.getContent().getField(fLayout.fieldSize()).getValue();
setMem(event, ptr, size);
}
break;
- case UstMemoryStrings.FREE: {
- Long ptr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_PTR).getValue();
+ case FREE_INDEX: {
+ Long ptr = (Long) event.getContent().getField(fLayout.fieldPtr()).getValue();
if (ZERO.equals(ptr)) {
return;
}
setMem(event, ptr, ZERO);
}
break;
- case UstMemoryStrings.CALLOC: {
- Long ptr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_PTR).getValue();
+ case CALLOC_INDEX: {
+ Long ptr = (Long) event.getContent().getField(fLayout.fieldPtr()).getValue();
if (ZERO.equals(ptr)) {
return;
}
- Long nmemb = (Long) event.getContent().getField(UstMemoryStrings.FIELD_NMEMB).getValue();
- Long size = (Long) event.getContent().getField(UstMemoryStrings.FIELD_SIZE).getValue();
+ Long nmemb = (Long) event.getContent().getField(fLayout.fieldNmemb()).getValue();
+ Long size = (Long) event.getContent().getField(fLayout.fieldSize()).getValue();
setMem(event, ptr, size * nmemb);
}
break;
- case UstMemoryStrings.REALLOC: {
- Long ptr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_PTR).getValue();
+ case REALLOC_INDEX: {
+ Long ptr = (Long) event.getContent().getField(fLayout.fieldPtr()).getValue();
if (ZERO.equals(ptr)) {
return;
}
- Long newPtr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_INPTR).getValue();
- Long size = (Long) event.getContent().getField(UstMemoryStrings.FIELD_SIZE).getValue();
+ Long newPtr = (Long) event.getContent().getField(fLayout.fieldInPtr()).getValue();
+ Long size = (Long) event.getContent().getField(fLayout.fieldSize()).getValue();
setMem(event, ptr, ZERO);
setMem(event, newPtr, size);
}
break;
- case UstMemoryStrings.MEMALIGN: {
- Long ptr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_PTR).getValue();
+ case MEMALIGN_INDEX: {
+ Long ptr = (Long) event.getContent().getField(fLayout.fieldPtr()).getValue();
if (ZERO.equals(ptr)) {
return;
}
- Long size = (Long) event.getContent().getField(UstMemoryStrings.FIELD_SIZE).getValue();
+ Long size = (Long) event.getContent().getField(fLayout.fieldSize()).getValue();
setMem(event, ptr, size);
}
break;
- case UstMemoryStrings.POSIX_MEMALIGN: {
- Long ptr = (Long) event.getContent().getField(UstMemoryStrings.FIELD_OUTPTR).getValue();
+ case POSIX_MEMALIGN_INDEX: {
+ Long ptr = (Long) event.getContent().getField(fLayout.fieldOutPtr()).getValue();
if (ZERO.equals(ptr)) {
return;
}
- Long size = (Long) event.getContent().getField(UstMemoryStrings.FIELD_SIZE).getValue();
+ Long size = (Long) event.getContent().getField(fLayout.fieldSize()).getValue();
setMem(event, ptr, size);
}
break;
default:
+ /* Ignore other event types */
break;
}
return VERSION;
}
- private static Long getVtid(ITmfEvent event) {
- ITmfEventField field = event.getContent().getField(UstMemoryStrings.CONTEXT_VTID);
+ private Long getVtid(ITmfEvent event) {
+ ITmfEventField field = event.getContent().getField(fLayout.contextVtid());
if (field == null) {
return MINUS_ONE;
}
return (Long) field.getValue();
}
- private static String getProcname(ITmfEvent event) {
- ITmfEventField field = event.getContent().getField(UstMemoryStrings.CONTEXT_PROCNAME);
+ private String getProcname(ITmfEvent event) {
+ ITmfEventField field = event.getContent().getField(fLayout.contextProcname());
if (field == null) {
return EMPTY_STRING;
}
long prevMemValue = prevMem.unboxLong();
prevMemValue += memoryDiff.longValue();
ss.modifyAttribute(ts, TmfStateValue.newValueLong(prevMemValue), tidMemQuark);
- } catch (AttributeNotFoundException | TimeRangeException | StateValueTypeException e) {
+ } catch (TimeRangeException | StateValueTypeException e) {
throw new IllegalStateException(e);
}
}