1
/*******************************************************************************
2
* Copyright (c) 2012, 2013 Ericsson
3
* Copyright (c) 2010, 2011 École Polytechnique de Montréal
4
* Copyright (c) 2010, 2011 Alexandre Montplaisir <alexandre.montplaisir@gmail.com>
6
* All rights reserved. This program and the accompanying materials are
7
* made available under the terms of the Eclipse Public License v1.0 which
8
* accompanies this distribution, and is available at
9
* http://www.eclipse.org/legal/epl-v10.html
11
*******************************************************************************/
13
package org.eclipse.linuxtools.internal.tmf.core.statesystem.backends.historytree;
15
import java.nio.ByteBuffer;
18
* A Core node is a first-level node of a History Tree which is not a leaf node.
20
* It extends HTNode by adding support for child nodes, and also extensions.
25
class CoreNode extends HTNode {
27
/** Number of bytes in a int */
28
private static final int SIZE_INT = 4;
30
/** Number of bytes in a long */
31
private static final int SIZE_LONG = 8;
33
/** Nb. of children this node has */
34
private int nbChildren;
36
/** Seq. numbers of the children nodes (size = MAX_NB_CHILDREN) */
37
private int[] children;
39
/** Start times of each of the children (size = MAX_NB_CHILDREN) */
40
private long[] childStart;
42
/** Seq number of this node's extension. -1 if none */
43
private int extension;
46
* Initial constructor. Use this to initialize a new EMPTY node.
49
* The HistoryTree to which this node belongs
51
* The (unique) sequence number assigned to this particular node
52
* @param parentSeqNumber
53
* The sequence number of this node's parent node
55
* The earliest timestamp stored in this node
57
CoreNode(HistoryTree tree, int seqNumber, int parentSeqNumber,
59
super(tree, seqNumber, parentSeqNumber, start);
61
int size = getTree().getConfig().getMaxChildren();
64
* We instantiate the two following arrays at full size right away,
65
* since we want to reserve that space in the node's header.
66
* "this.nbChildren" will tell us how many relevant entries there are in
69
this.children = new int[size];
70
this.childStart = new long[size];
74
protected void readSpecificHeader(ByteBuffer buffer) {
75
int size = getTree().getConfig().getMaxChildren();
77
extension = buffer.getInt();
78
nbChildren = buffer.getInt();
80
children = new int[size];
81
for (int i = 0; i < nbChildren; i++) {
82
children[i] = buffer.getInt();
84
for (int i = nbChildren; i < size; i++) {
88
this.childStart = new long[size];
89
for (int i = 0; i < nbChildren; i++) {
90
childStart[i] = buffer.getLong();
92
for (int i = nbChildren; i < size; i++) {
98
protected void writeSpecificHeader(ByteBuffer buffer) {
99
int size = getTree().getConfig().getMaxChildren();
101
buffer.putInt(extension);
102
buffer.putInt(nbChildren);
104
/* Write the "children's seq number" array */
105
for (int i = 0; i < nbChildren; i++) {
106
buffer.putInt(children[i]);
108
for (int i = nbChildren; i < size; i++) {
112
/* Write the "children's start times" array */
113
for (int i = 0; i < nbChildren; i++) {
114
buffer.putLong(childStart[i]);
116
for (int i = nbChildren; i < size; i++) {
121
int getNbChildren() {
125
int getChild(int index) {
126
return children[index];
129
int getLatestChild() {
130
return children[nbChildren - 1];
133
long getChildStart(int index) {
134
return childStart[index];
137
long getLatestChildStart() {
138
return childStart[nbChildren - 1];
141
int getExtensionSequenceNumber() {
146
* Tell this node that it has a new child (Congrats!)
149
* The SHTNode object of the new child
151
void linkNewChild(CoreNode childNode) {
152
assert (this.nbChildren < getTree().getConfig().getMaxChildren());
154
this.children[nbChildren] = childNode.getSequenceNumber();
155
this.childStart[nbChildren] = childNode.getNodeStart();
160
protected byte getNodeType() {
165
protected int getTotalHeaderSize() {
166
int maxChildren = getTree().getConfig().getMaxChildren();
168
SIZE_INT /* 1x int (extension node) */
169
+ SIZE_INT /* 1x int (nbChildren) */
171
/* MAX_NB * int ('children' table) */
172
+ SIZE_INT * maxChildren
174
/* MAX_NB * Timevalue ('childStart' table) */
175
+ SIZE_LONG * maxChildren;
177
return COMMON_HEADER_SIZE + specificSize;
181
protected String toStringSpecific() {
182
/* Only used for debugging, shouldn't be externalized */
183
return "Core Node, " + nbChildren + " children, "; //$NON-NLS-1$ //$NON-NLS-2$