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.jikesrvm.VM;
018 import org.vmmagic.pragma.Interruptible;
019 import org.vmmagic.pragma.Uninterruptible;
020
021 @Uninterruptible
022 public abstract class Chunk extends RawChunk {
023
024 private static final int MAGIC_WORD_1 = 0xdeadbeef;
025 private static final int MAGIC_WORD_2 = 0xcafebabe;
026 private static final int LENGTH_OFFSET = 8;
027 private static final int CHUNK_TYPE_OFFSET = 12;
028 protected static final int DATA_OFFSET = 16;
029
030 protected final static int DEFAULT_CHUNK_SIZE = 16 * 1024;
031
032 protected Chunk(int chunkType, byte[] buffer) {
033 super(buffer);
034 addInt(MAGIC_WORD_1);
035 addInt(MAGIC_WORD_2);
036 seek(CHUNK_TYPE_OFFSET);
037 addInt(chunkType);
038 seek(DATA_OFFSET);
039 }
040
041 protected Chunk(int chunkType, int capacity) {
042 this(chunkType, new byte[capacity]);
043 }
044
045 protected Chunk(int chunkType) {
046 this(chunkType, new byte[DEFAULT_CHUNK_SIZE]);
047 }
048
049 @Override
050 public void close() {
051 int pos = getPosition();
052 int bodyLength = pos - DATA_OFFSET;
053 putIntAt(LENGTH_OFFSET, bodyLength);
054 super.close();
055 }
056
057 @Override
058 protected void resetImpl() {
059 super.resetImpl();
060 seek(DATA_OFFSET);
061 }
062
063 @Interruptible
064 protected char[] getChars(String s) {
065 if (VM.runningVM) {
066 return JikesRVMSupport.getBackingCharArray(s);
067 } else {
068 return s.toCharArray();
069 }
070 }
071 }