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    import org.vmmagic.pragma.Untraced;
019    
020    import com.ibm.tuningfork.tracegen.types.EventType;
021    
022    @Uninterruptible
023    public final class EventChunk extends Chunk {
024    
025      public static final int EVENT_TYPE_ID = 5;
026      public static final int FEEDLET_ID_OFFSET = Chunk.DATA_OFFSET;
027      public static final int SEQUENCE_NUMBER_OFFSET = Chunk.DATA_OFFSET + 4;
028      public static final int EVENT_DATA_OFFSET = Chunk.DATA_OFFSET + 8;
029      protected final static int DEFAULT_EVENT_CHUNK_SIZE = 16 * 1024;
030    
031      /* Only for use by EventChunkQueue */
032      @Untraced
033      public EventChunk next = null;
034    
035      public EventChunk() {
036        super(EVENT_TYPE_ID, DEFAULT_EVENT_CHUNK_SIZE);
037        seek(EVENT_DATA_OFFSET);
038      }
039    
040      public void reset(int feedletIndex, int sequenceNumber) {
041        super.resetImpl();
042        seek(EVENT_DATA_OFFSET);
043        putIntAt(FEEDLET_ID_OFFSET, feedletIndex);
044        putIntAt(SEQUENCE_NUMBER_OFFSET, sequenceNumber);
045      }
046    
047      public boolean addEvent(long timeStamp, EventType et) {
048        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT;
049        if (!hasRoom(required)) {
050          return false;
051        }
052        addLongUnchecked(timeStamp);
053        addIntUnchecked(et.getIndex());
054        return true;
055      }
056    
057      public boolean addEvent(long timeStamp, EventType et, int v) {
058        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT
059        + ENCODING_SPACE_INT;
060        if (!hasRoom(required)) {
061          return false;
062        }
063        addLongUnchecked(timeStamp);
064        addIntUnchecked(et.getIndex());
065        addIntUnchecked(v);
066        return true;
067      }
068    
069      public boolean addEvent(long timeStamp, EventType et, int v1, int v2) {
070        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + 2*ENCODING_SPACE_INT;
071        if (!hasRoom(required)) {
072          return false;
073        }
074        addLongUnchecked(timeStamp);
075        addIntUnchecked(et.getIndex());
076        addIntUnchecked(v1);
077        addIntUnchecked(v2);
078        return true;
079      }
080    
081      public boolean addEvent(long timeStamp, EventType et, int v1, int v2, int v3) {
082        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + 3*ENCODING_SPACE_INT;
083        if (!hasRoom(required)) {
084          return false;
085        }
086        addLongUnchecked(timeStamp);
087        addIntUnchecked(et.getIndex());
088        addIntUnchecked(v1);
089        addIntUnchecked(v2);
090        addIntUnchecked(v3);
091        return true;
092      }
093    
094      public boolean addEvent(long timeStamp, EventType et, int v1, int v2, int v3, int v4) {
095        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + 4*ENCODING_SPACE_INT;
096        if (!hasRoom(required)) {
097          return false;
098        }
099        addLongUnchecked(timeStamp);
100        addIntUnchecked(et.getIndex());
101        addIntUnchecked(v1);
102        addIntUnchecked(v2);
103        addIntUnchecked(v3);
104        addIntUnchecked(v4);
105        return true;
106      }
107    
108      public boolean addEvent(long timeStamp, EventType et, long v) {
109        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + ENCODING_SPACE_LONG;
110        if (!hasRoom(required)) {
111          return false;
112        }
113        addLongUnchecked(timeStamp);
114        addIntUnchecked(et.getIndex());
115        addLongUnchecked(v);
116        return true;
117      }
118    
119      public boolean addEvent(long timeStamp, EventType et, double v) {
120        int required = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + ENCODING_SPACE_DOUBLE;
121        if (!hasRoom(required)) {
122          return false;
123        }
124        addLongUnchecked(timeStamp);
125        addIntUnchecked(et.getIndex());
126        addDoubleUnchecked(v);
127        return true;
128      }
129    
130      public boolean addEvent(long timeStamp, EventType et, String v) {
131        int guess = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + JikesRVMSupport.getStringLength(v);
132        if (!hasRoom(guess)) {
133          return false;
134        }
135        int savedCursor = getPosition();
136        addLongUnchecked(timeStamp);
137        addIntUnchecked(et.getIndex());
138        if (!addString(v)) {
139          seek(savedCursor);
140          return false;
141        }
142        return true;
143      }
144    
145      public boolean addEvent(long timeStamp, EventType et, int iv, double dv) {
146        int required = ENCODING_SPACE_LONG + 2 * ENCODING_SPACE_INT + ENCODING_SPACE_DOUBLE;
147        if (!hasRoom(required)) {
148          return false;
149        }
150        addLongUnchecked(timeStamp);
151        addIntUnchecked(et.getIndex());
152        addIntUnchecked(iv);
153        addDoubleUnchecked(dv);
154        return true;
155      }
156    
157      public boolean addEvent(long timeStamp, EventType et, int iv1, int iv2, double dv) {
158        int required = ENCODING_SPACE_LONG + 3 * ENCODING_SPACE_INT + ENCODING_SPACE_DOUBLE;
159        if (!hasRoom(required)) {
160          return false;
161        }
162        addLongUnchecked(timeStamp);
163        addIntUnchecked(et.getIndex());
164        addIntUnchecked(iv1);
165        addIntUnchecked(iv2);
166        addDoubleUnchecked(dv);
167        return true;
168      }
169    
170      public boolean addEvent(long timeStamp, EventType et, double dv, String sv) {
171        int guess = ENCODING_SPACE_LONG + ENCODING_SPACE_DOUBLE + ENCODING_SPACE_INT + JikesRVMSupport.getStringLength(sv);
172        if (!hasRoom(guess)) {
173          return false;
174        }
175        int savedCursor = getPosition();
176        addLongUnchecked(timeStamp);
177        addIntUnchecked(et.getIndex());
178        addDoubleUnchecked(dv);
179        if (!addString(sv)) {
180          seek(savedCursor);
181          return false;
182        }
183        return true;
184      }
185    
186      public boolean addEvent(long timeStamp, EventType et, int[] idata,
187                              long[] ldata, double[] ddata, String[] sdata) {
188        int ilen = (idata == null) ? 0 : idata.length;
189        int llen = (ldata == null) ? 0 : ldata.length;
190        int dlen = (ddata == null) ? 0 : ddata.length;
191        int slen = (sdata == null) ? 0 : sdata.length;
192        int guess = ENCODING_SPACE_LONG + ENCODING_SPACE_INT + ilen * ENCODING_SPACE_INT +
193                    llen * ENCODING_SPACE_LONG + dlen * ENCODING_SPACE_DOUBLE;
194        if (!hasRoom(guess)) {
195          return false;
196        }
197        int savedPosition = getPosition();
198        addLongUnchecked(timeStamp);
199        addIntUnchecked(et.getIndex());
200        for (int i = 0; i < ilen; i++) {
201          addIntUnchecked(idata[i]);
202        }
203        for (int i = 0; i < llen; i++) {
204          addLongUnchecked(ldata[i]);
205        }
206        for (int i = 0; i < dlen; i++) {
207          addDoubleUnchecked(ddata[i]);
208        }
209        for (int i = 0; i < slen; i++) {
210          if (!addString(sdata[i])) {
211            seek(savedPosition);
212            return false;
213          }
214        }
215        return true;
216      }
217    
218    }