blob: 9334b98e02a5a0d8450aa0be8fd879de5ee3d53d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.offheap;
import java.util.Collections;
import java.util.List;
/**
* Implementation of MemoryInspector that provides for inspection of meta-data for off-heap memory
* blocks
*/
public class MemoryInspectorImpl implements MemoryInspector {
/** The inspection snapshot for MemoryInspector */
private List<MemoryBlock> memoryBlocks;
private FreeListManager freeList;
public MemoryInspectorImpl(FreeListManager freeList) {
this.freeList = freeList;
}
@Override
public synchronized void clearSnapshot() {
this.memoryBlocks = null;
}
@Override
public synchronized void createSnapshot() {
List<MemoryBlock> value = this.memoryBlocks;
if (value == null) {
value = getOrderedBlocks();
this.memoryBlocks = value;
}
}
@Override
public synchronized List<MemoryBlock> getSnapshot() {
List<MemoryBlock> value = this.memoryBlocks;
if (value == null) {
return Collections.<MemoryBlock>emptyList();
} else {
return value;
}
}
@Override
public MemoryBlock getFirstBlock() {
final List<MemoryBlock> value = getSnapshot();
if (value.isEmpty()) {
return null;
} else {
return value.get(0);
}
}
@Override
public List<MemoryBlock> getAllBlocks() {
return getOrderedBlocks();
}
@Override
public List<MemoryBlock> getAllocatedBlocks() {
return this.freeList.getAllocatedBlocks();
}
@Override
public MemoryBlock getBlockAfter(MemoryBlock block) {
if (block == null) {
return null;
}
List<MemoryBlock> blocks = getSnapshot();
int nextBlock = blocks.indexOf(block) + 1;
if (nextBlock > 0 && blocks.size() > nextBlock) {
return blocks.get(nextBlock);
} else {
return null;
}
}
private List<MemoryBlock> getOrderedBlocks() {
return this.freeList.getOrderedBlocks();
}
}