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.
22 * @author Alexandre Montplaisir
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 * Configuration of the History Tree
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(HTConfig config
, int seqNumber
, int parentSeqNumber
,
59 super(config
, seqNumber
, parentSeqNumber
, start
);
61 int size
= config
.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
= 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
= 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
< 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
= 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$
This page took 0.035408 seconds and 6 git commands to generate.