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    }