/*******************************************************************************
* Copyright (c) 2016 École Polytechnique de Montréal
*
* 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
*******************************************************************************/
package org.eclipse.tracecompass.internal.analysis.os.linux.core.inputoutput;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.IoOperationType;
/**
* Represents a request to a disk of the system
*
* @author Houssem Daoud
*/
public class Request {
private Long fSector;
private int fNrSector;
private final DiskWriteModel fDisk;
private final List<BlockIO> fBios = new ArrayList<>();
private @Nullable Integer fIssuedFrom = null;
private IoOperationType fType;
/**
* Constructor
*
* @param disk
* The disk for this request
* @param sector
* The base sector of this request
* @param rwbs
* The read/write bits
*/
public Request(DiskWriteModel disk, Long sector, int rwbs) {
fSector = sector;
fNrSector = 0;
fDisk = disk;
fType = IoOperationType.getType(rwbs);
}
/**
* Constructor from a Block IO structure
*
* @param bio
* The BIO to start this request from
*/
public Request(BlockIO bio) {
fSector = bio.getSector();
fNrSector = bio.getNrSector();
fType = bio.getType();
fBios.add(0, bio);
fDisk = bio.getDisk();
}
/**
* Get the base sector of this request
*
* @return The base sector
*/
public Long getSector() {
return fSector;
}
/**
* Get the number of sectors of this request
*
* @return The number of sectors
*/
public int getNrSector() {
return fNrSector;
}
/**
* Updates the number of sectors for this request
*
* @param nrSector
* The new number of sectors
*/
public void setNrSector(int nrSector) {
fNrSector = nrSector;
}
/**
* Get the disk this request is for
*
* @return The disk of this BIO
*/
public DiskWriteModel getDisk() {
return fDisk;
}
/**
* Get the type of request
*
* @return The type of request
*/
public IoOperationType getType() {
return fType;
}
/**
* Set the read/write mode of this request
*
* @param rwbs
* The read/write bits of the request
*/
public void setType(int rwbs) {
fType = IoOperationType.getType(rwbs);
}
/**
* Get the list of BIOs included in this request
*
* @return The list of BIOs
*/
public List<BlockIO> getBios() {
return Collections.unmodifiableList(fBios);
}
/**
* Get the request this request is based on
*
* @return The quark of the request this is issued from
*/
public @Nullable Integer getIssuedFrom() {
return fIssuedFrom;
}
/**
* Insert the BIO into this request
*
* @param bio
* The Block IO to insert in this request
*/
public void insertBio(BlockIO bio) {
fBios.add(bio);
fNrSector += bio.getNrSector();
if (bio.getSector() < getSector()) {
fSector = bio.getSector();
}
}
/**
* Merges a request into this one
*
* @param request
* The second request to merge
*/
public void mergeRequest(Request request) {
fBios.addAll(request.getBios());
fNrSector = getNrSector() + request.getNrSector();
}
}