/* * Title: CloudSim Toolkit * Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds * Licence: GPL - http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2009-2012, The University of Melbourne, Australia */ package org.cloudbus.cloudsim.core; /** * This class represents a simulation event which is passed between the entities in the simulation. * * @author Costas Simatos * @see Simulation * @see SimEntity */ public class SimEvent implements Cloneable, Comparable<SimEvent> { /** Internal event type. **/ private final int etype; /** The time that this event was scheduled, at which it should occur. **/ private final double time; /** Time that the event was removed from the queue to start service. **/ private double endWaitingTime; /** Id of entity who scheduled the event. **/ private int entSrc; /** Id of entity that the event will be sent to. **/ private int entDst; /** The user defined type of the event. **/ private final int tag; /** * Any data the event is carrying. * @todo I would be used generics to define the type of the event data. * But this modification would incur several changes in the simulator core * that has to be assessed first. **/ private final Object data; /** * An attribute to help CloudSim to identify the order of received events * when multiple events are generated at the same time. * If two events have the same {@link #time}, to know * what event is greater than other (i.e. that happens after other), * the {@link #compareTo(org.cloudbus.cloudsim.core.SimEvent)} * makes use of this field. */ private long serial = -1; // Internal event types public static final int ENULL = 0; public static final int SEND = 1; public static final int HOLD_DONE = 2; public static final int CREATE = 3; /** * Creates a blank event. */ public SimEvent() { etype = ENULL; time = -1L; endWaitingTime = -1.0; entSrc = -1; entDst = -1; tag = -1; data = null; } // ------------------- PACKAGE LEVEL METHODS -------------------------- SimEvent(int evtype, double time, int src, int dest, int tag, Object edata) { etype = evtype; this.time = time; entSrc = src; entDst = dest; this.tag = tag; data = edata; } SimEvent(int evtype, double time, int src) { etype = evtype; this.time = time; entSrc = src; entDst = -1; tag = -1; data = null; } protected void setSerial(long serial) { this.serial = serial; } /** * Sets the time that the event was removed from the queue to start service. * * @param end_waiting_time */ protected void setEndWaitingTime(double end_waiting_time) { endWaitingTime = end_waiting_time; } // ------------------- PUBLIC METHODS -------------------------- @Override public String toString() { return "Event tag = " + tag + " source = " + CloudSim.getEntity(entSrc).getName() + " destination = " + CloudSim.getEntity(entDst).getName(); } /** * Gets the internal type * * @return */ public int getType() { return etype; } @Override public int compareTo(SimEvent event) { if (event == null) { return 1; } else if (time < event.time) { return -1; } else if (time > event.time) { return 1; } else if (serial < event.serial) { return -1; } else if (this == event) { return 0; } else { return 1; } } /** * Get the unique id number of the entity which received this event. * * @return the id number */ public int getDestination() { return entDst; } /** * Get the unique id number of the entity which scheduled this event. * * @return the id number */ public int getSource() { return entSrc; } /** * Get the simulation time that this event was scheduled. * * @return The simulation time */ public double eventTime() { return time; } /** * Get the simulation time that this event was removed from the queue for service. * * @return The simulation time */ public double endWaitingTime() { return endWaitingTime; } /** * Get the user-defined tag of this event * * @return The tag */ public int type() { return tag; } /** * Get the unique id number of the entity which scheduled this event. * * @return the id number */ public int scheduledBy() { return entSrc; } /** * Get the user-defined tag of this event. * * @return The tag */ public int getTag() { return tag; } /** * Get the data passed in this event. * * @return A reference to the data */ public Object getData() { return data; } @Override public Object clone() { return new SimEvent(etype, time, entSrc, entDst, tag, data); } /** * Set the source entity of this event. * * @param s The unique id number of the entity */ public void setSource(int s) { entSrc = s; } /** * Set the destination entity of this event. * * @param d The unique id number of the entity */ public void setDestination(int d) { entDst = d; } }