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 }