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
015 package com.ibm.tuningfork.tracegen.chunk;
016
017 import org.vmmagic.pragma.Uninterruptible;
018
019 @Uninterruptible
020 public class PropertyTableChunk extends Chunk {
021
022 public static final int PROPERTY_TABLE_ID = 1;
023 public static final int PROPERTY_COUNT_OFFSET = Chunk.DATA_OFFSET;
024 public static final int PROPERTY_DATA_OFFSET = PROPERTY_COUNT_OFFSET + 4;
025 private int numberOfProperties = 0;
026
027 public PropertyTableChunk() {
028 super(PROPERTY_TABLE_ID);
029 seek(PROPERTY_DATA_OFFSET);
030 }
031
032 public boolean add(String prop, String val) {
033 int guess = JikesRVMSupport.getStringLength(prop) + JikesRVMSupport.getStringLength(val);
034 if (!hasRoom(guess)) {
035 return false;
036 }
037 int savedPosition = getPosition();
038 if (!addString(prop)) {
039 seek(savedPosition);
040 return false;
041 }
042 if (!addString(val)) {
043 seek(savedPosition);
044 return false;
045 }
046 numberOfProperties++;
047 return true;
048 }
049
050 @Override
051 public void close() {
052 putIntAt(PROPERTY_COUNT_OFFSET, numberOfProperties);
053 numberOfProperties = 0;
054 super.close();
055 }
056
057 public boolean hasData() {
058 return numberOfProperties > 0;
059 }
060
061 public void reset() {
062 resetImpl();
063 numberOfProperties = 0;
064 seek(PROPERTY_DATA_OFFSET);
065 }
066 }