/*
* 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.lists;
import java.util.List;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.Pe;
import org.cloudbus.cloudsim.Vm;
/**
* PeList is a collection of operations on lists of PEs.
*
* @author Anton Beloglazov
* @since CloudSim Toolkit 2.0
*/
public class PeList {
/**
* Gets MIPS Rating for a specified Pe ID.
*
* @param id the Pe ID
* @param peList the pe list
* @return the MIPS rating if exists, otherwise returns -1
* @pre id >= 0
* @post $none
*/
public static <T extends Pe> Pe getById(List<T> peList, int id) {
for (Pe pe : peList) {
if (pe.getId() == id) {
return pe;
}
}
return null;
}
/**
* Gets MIPS Rating for a specified Pe ID.
*
* @param id the Pe ID
* @param peList the pe list
* @return the MIPS rating if exists, otherwise returns -1
* @pre id >= 0
* @post $none
*/
public static <T extends Pe> int getMips(List<T> peList, int id) {
Pe pe = getById(peList, id);
if (pe != null) {
return pe.getMips();
}
return -1;
}
/**
* Gets total MIPS Rating for all PEs.
*
* @param peList the pe list
* @return the total MIPS Rating
* @pre $none
* @post $none
*/
public static <T extends Pe> int getTotalMips(List<T> peList) {
int totalMips = 0;
for (Pe pe : peList) {
totalMips += pe.getMips();
}
return totalMips;
}
/**
* Gets the max utilization among by all PEs.
*
* @param peList the pe list
* @return the utilization
*/
public static <T extends Pe> double getMaxUtilization(List<T> peList) {
double maxUtilization = 0;
for (Pe pe : peList) {
double utilization = pe.getPeProvisioner().getUtilization();
if (utilization > maxUtilization) {
maxUtilization = utilization;
}
}
return maxUtilization;
}
/**
* Gets the max utilization among by all PEs allocated to the VM.
*
* @param vm the vm
* @param peList the pe list
* @return the utilization
*/
public static <T extends Pe> double getMaxUtilizationAmongVmsPes(List<T> peList, Vm vm) {
double maxUtilization = 0;
for (Pe pe : peList) {
if (pe.getPeProvisioner().getAllocatedMipsForVm(vm) == null) {
continue;
}
double utilization = pe.getPeProvisioner().getUtilization();
if (utilization > maxUtilization) {
maxUtilization = utilization;
}
}
return maxUtilization;
}
/**
* Gets a Pe ID which is FREE.
*
* @param peList the pe list
* @return a Pe ID if it is FREE, otherwise returns -1
* @pre $none
* @post $none
*/
public static <T extends Pe> Pe getFreePe(List<T> peList) {
for (Pe pe : peList) {
if (pe.getStatus() == Pe.FREE) {
return pe;
}
}
return null;
}
/**
* Gets the number of <tt>FREE</tt> or non-busy Pe.
*
* @param peList the pe list
* @return number of Pe
* @pre $none
* @post $result >= 0
*/
public static <T extends Pe> int getNumberOfFreePes(List<T> peList) {
int cnt = 0;
for (Pe pe : peList) {
if (pe.getStatus() == Pe.FREE) {
cnt++;
}
}
return cnt;
}
/**
* Sets the Pe status.
*
* @param status Pe status, either <tt>Pe.FREE</tt> or <tt>Pe.BUSY</tt>
* @param id the id
* @param peList the pe list
* @return <tt>true</tt> if the Pe status has been changed, <tt>false</tt> otherwise (Pe id might
* not be exist)
* @pre peID >= 0
* @post $none
*/
public static <T extends Pe> boolean setPeStatus(List<T> peList, int id, int status) {
Pe pe = getById(peList, id);
if (pe != null) {
pe.setStatus(status);
return true;
}
return false;
}
/**
* Gets the number of <tt>BUSY</tt> Pe.
*
* @param peList the pe list
* @return number of Pe
* @pre $none
* @post $result >= 0
*/
public static <T extends Pe> int getNumberOfBusyPes(List<T> peList) {
int cnt = 0;
for (Pe pe : peList) {
if (pe.getStatus() == Pe.BUSY) {
cnt++;
}
}
return cnt;
}
/**
* Sets the status of PEs of this machine to FAILED. NOTE: <tt>resName</tt> and
* <tt>machineID</tt> are used for debugging purposes, which is <b>ON</b> by default. Use
* {@link #setStatusFailed(boolean)} if you do not want this information.
*
* @param resName the name of the resource
* @param hostId the id of this machine
* @param failed the new value for the "failed" parameter
*/
public static <T extends Pe> void setStatusFailed(
List<T> peList,
String resName,
int hostId,
boolean failed) {
String status = null;
if (failed) {
status = "FAILED";
} else {
status = "WORKING";
}
Log.printLine(resName + " - Machine: " + hostId + " is " + status);
setStatusFailed(peList, failed);
}
/**
* Sets the status of PEs of this machine to FAILED.
*
* @param failed the new value for the "failed" parameter
* @param peList the pe list
*/
public static <T extends Pe> void setStatusFailed(List<T> peList, boolean failed) {
// a loop to set the status of all the PEs in this machine
for (Pe pe : peList) {
if (failed) {
pe.setStatus(Pe.FAILED);
} else {
pe.setStatus(Pe.FREE);
}
}
}
}