/*****************************************************************************
* Copyright (c) 2009, 2010 g-Eclipse Consortium
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Initial development of the original code was made for the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Thomas Koeckerbauer MNM-Team, LMU Munich - initial API and implementation
*****************************************************************************/
package eu.geclipse.eventgraph.tracereader.otf;
import java.util.ArrayList;
import eu.geclipse.traceview.EventType;
import eu.geclipse.traceview.utils.AbstractProcessFileCache;
/**
* OTF Process
*/
public final class Process extends AbstractProcessFileCache {
private int logClock = 0;
private ArrayList<Integer[]> previousEvents; // TODO store information in tracecache
Process( final int processId, final OTFReader trace ) {
super( trace, processId );
this.previousEvents = new ArrayList<Integer[]>();
this.previousEvents.add( new Integer[0] );
}
void appendEvent( final EventType type, final int partnerId, final int sentMessageLength, final int receivedMessageLength, final int messageType, final int messageGroup, final int timestamp ) {
setMaximumLogicalClock( this.logClock );
Event event = new Event( this.logClock, this );
event.setType( type );
event.setFunctionId( -1 );
event.setPartnerProcessId( partnerId );
event.setPartnerLogicalClock( -1 );
event.setMessageGroup( messageGroup );
event.setMessageType( messageType );
event.setPartnerLamportClock( -1 );
event.setLamportClock( -1 );
event.setSentMessageLength( sentMessageLength );
event.setReceivedMessageLength( receivedMessageLength );
event.setPhysicalStartClock( timestamp );
this.logClock++;
}
void appendEvent( final EventType type, final int partnerId, final int timestamp ) {
setMaximumLogicalClock( this.logClock );
Event event = new Event( this.logClock, this );
event.setType( type );
event.setFunctionId( -1 );
event.setPartnerProcessId( partnerId );
event.setPartnerLogicalClock( -1 );
event.setMessageType( -1 );
event.setPartnerLamportClock( -1 );
event.setLamportClock( -1 );
event.setSentMessageLength( 0 );
event.setReceivedMessageLength( 0 );
event.setPhysicalStartClock( timestamp );
// set this since it is the last field in the event and if it is not set
// there will be an out of bounds exception if it is accessed
event.setMessageGroup( -1 );
this.logClock++;
}
void appendFunctionEvent( final EventType type, final int function, final int timestamp ) {
setMaximumLogicalClock( this.logClock );
Event event = new Event( this.logClock, this );
event.setType( type );
event.setFunctionId( function );
event.setPartnerProcessId( -1 );
event.setPartnerLogicalClock( -1 );
event.setMessageType( -1 );
event.setPartnerLamportClock( -1 );
event.setSentMessageLength( 0 );
event.setReceivedMessageLength( 0 );
event.setLamportClock( -1 );
event.setPhysicalStartClock( timestamp );
// set this since it is the last field in the event and if it is not set
// there will be an out of bounds exception if it is accessed
event.setMessageGroup( -1 );
this.logClock++;
}
public Event getEventByLogicalClock( final int index ) throws IndexOutOfBoundsException {
Event event = new Event( index, this );
return event;
}
@Override
@SuppressWarnings("boxing")
public Event[] getEventsByPhysicalClock( final int timeStart,
final int timeStop )
{
ArrayList<Event> events = new ArrayList<Event>();
try {
Event event = (Event) getPhysicalEvent( timeStart );
if( event != null ) {
if( event.getPhysicalStartClock() <= timeStop )
events.add( event );
event = event.getNextEvent();
while( event != null && event.getPhysicalStartClock() < timeStop ) {
events.add( event );
event = event.getNextEvent();
}
}
} catch( IndexOutOfBoundsException e ) {
// empty
}
Event event = null;
if( events.size() != 0 ) {
event = events.get( 0 );
} else {
event = (Event) getPhysicalEvent( timeStart );
}
if( event != null ) {
int index = event.getLogicalClock();
event = event.getPreviousEvent();
for( int i = index % 1000; i > 0; i-- ) {
if( event.getPhysicalStopClock() > timeStart ) {
events.add( 0, event);
}
event = event.getPreviousEvent();
}
if( this.previousEvents.size() > index / 1000 ) {
Integer[] indices = this.previousEvents.get( index / 1000 );
for( int i = indices.length - 1; i >= 0; i-- ) {
events.add( 0, getEventByLogicalClock( indices[ i ] ) );
}
}
}
return events.toArray( new Event[ 0 ] );
}
/**
* Add events for the previous time frame.
*
* @param events
*/
protected void addPreviousEvents(final Integer[] events) {
this.previousEvents.add( events );
}
}