001/* 002 * This file is part of the Tuning Fork Visualization Platform 003 * (http://sourceforge.net/projects/tuningforkvp) 004 * 005 * Copyright (c) 2005 - 2008 IBM Corporation. 006 * All rights reserved. This program and the accompanying materials 007 * are made available under the terms of the Eclipse Public License v1.0 008 * which accompanies this distribution, and is available at 009 * http://www.eclipse.org/legal/epl-v10.html 010 * 011 * Contributors: 012 * IBM Corporation - initial API and implementation 013 */ 014 015package com.ibm.tuningfork.tracegen.chunk; 016 017import org.vmmagic.pragma.Uninterruptible; 018 019@Uninterruptible 020public class StringTableChunk extends Chunk { 021 022 public static final int STRING_TABLE_ID = 6; 023 public static final int STRING_COUNT_OFFSET = Chunk.DATA_OFFSET; 024 public static final int STRING_DATA_OFFSET = STRING_COUNT_OFFSET + 4; 025 private int numberOfStrings = 0; 026 027 public StringTableChunk() { 028 super(STRING_TABLE_ID); 029 seek(STRING_DATA_OFFSET); 030 } 031 032 public boolean add(int index, String val) { 033 int guess = ENCODING_SPACE_INT + JikesRVMSupport.getStringLength(val); 034 if (!hasRoom(guess)) { 035 return false; 036 } 037 int savedPosition = getPosition(); 038 addInt(index); 039 if (!addString(val)) { 040 seek(savedPosition); 041 return false; 042 } 043 numberOfStrings++; 044 return true; 045 } 046 047 @Override 048 public void close() { 049 putIntAt(STRING_COUNT_OFFSET, numberOfStrings); 050 numberOfStrings = 0; 051 super.close(); 052 } 053 054 public boolean hasData() { 055 return numberOfStrings > 0; 056 } 057 058 public void reset() { 059 resetImpl(); 060 numberOfStrings = 0; 061 seek(STRING_DATA_OFFSET); 062 } 063}