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 }