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.Interruptible;
018 import org.vmmagic.pragma.Uninterruptible;
019
020 @Uninterruptible
021 public class FeedletChunk extends Chunk {
022
023 public static final int FEEDLET_TYPE_ID = 2;
024 public static final int FEEDLET_COUNT_OFFSET = Chunk.DATA_OFFSET;
025 public static final int FEEDLET_DATA_OFFSET = FEEDLET_COUNT_OFFSET + 4;
026 public static final int FEEDLET_ADD_OPERATION = 1;
027 public static final int FEEDLET_REMOVE_OPERATION = 2;
028 public static final int FEEDLET_DESCRIBE_OPERATION = 3;
029 public static final String NAME_PROPERTY = "name";
030 public static final String DECSRIPTION_PROPERTY = "description";
031
032 private int feedletOperations = 0;
033
034 public FeedletChunk() {
035 super(FEEDLET_TYPE_ID);
036 seek(FEEDLET_DATA_OFFSET);
037 }
038
039 public boolean hasData() {
040 return feedletOperations > 0;
041 }
042
043 @Interruptible
044 public boolean add(int feedletIndex, String name, String description) {
045 int savedPosition = getPosition();
046 int savedOperationCount = feedletOperations;
047 boolean success = false;
048 try {
049 if (!addInt(FEEDLET_ADD_OPERATION)) return false;
050 if (!addInt(feedletIndex)) return false;
051 feedletOperations++;
052 if (!addProperty(feedletIndex, NAME_PROPERTY, name)) return false;
053 if (!addProperty(feedletIndex, DECSRIPTION_PROPERTY, description)) return false;
054 success = true;
055 return true;
056 } finally {
057 if (!success) {
058 seek(savedPosition);
059 feedletOperations = savedOperationCount;
060 }
061 }
062 }
063
064 public boolean remove(int feedletIndex) {
065 if (!hasRoom(ENCODING_SPACE_INT*2)) return false;
066 addIntUnchecked(FEEDLET_REMOVE_OPERATION);
067 addIntUnchecked(feedletIndex);
068 feedletOperations++;
069 return true;
070 }
071
072 @Interruptible
073 public boolean addProperty(int feedletIndex, String key, String val) {
074 int savedPosition = getPosition();
075 int savedOperationCount = feedletOperations;
076 boolean success = false;
077 try {
078 if (!addInt(FEEDLET_DESCRIBE_OPERATION)) return false;
079 if (!addInt(feedletIndex)) return false;
080 if (!addStringInternal(getChars(key))) return false;
081 if (!addStringInternal(getChars(val))) return false;
082 feedletOperations++;
083 success = true;
084 return true;
085 } finally {
086 if (!success) {
087 seek(savedPosition);
088 feedletOperations = savedOperationCount;
089 }
090 }
091 }
092
093 @Override
094 public void close() {
095 putIntAt(FEEDLET_COUNT_OFFSET, feedletOperations);
096 feedletOperations = 0;
097 super.close();
098 }
099
100 public void reset() {
101 resetImpl();
102 feedletOperations = 0;
103 seek(FEEDLET_DATA_OFFSET);
104 }
105 }