
org.jbpm.simulation.impl.ht.AllocatedResources Maven / Gradle / Ivy
/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.simulation.impl.ht;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class AllocatedResources {
private int poolSize;
private long performedWork = 0;
private List allocatedTill = new ArrayList();
public AllocatedResources(int poolSize) {
this.poolSize = poolSize;
}
public AllocatedWork allocate(long startTime, long duration, long limit) {
long waitTime = 0;
AllocatedWork allocatedWork = new AllocatedWork(duration);
performedWork += duration;
if(poolSize == 0) {
// no available resources
allocatedWork.setAllocatedTime(startTime + duration);
allocatedWork.setWaitTime(duration);
return allocatedWork;
}
if(allocatedTill.size() < poolSize) {
long allocated = startTime + duration;
if (allocated > limit) {
allocated = limit;
}
allocatedTill.add(allocated);
allocatedWork.setAllocatedTime(allocated - startTime);
allocatedWork.setWaitTime(waitTime);
} else {
Collections.sort(allocatedTill);
long allocated = allocatedTill.get(0);
if (allocated == limit) {
waitTime = allocated - startTime;
allocatedWork.setAllocatedTime(0);
allocatedWork.setWaitTime(waitTime);
return allocatedWork;
}
if (allocated >= startTime) {
waitTime = allocated - startTime;
allocated += duration;
} else {
allocated = startTime + duration;
}
if (allocated > limit) {
allocatedTill.set(0, limit);
allocatedWork.setAllocatedTime(duration - (allocated - limit));
allocatedWork.setWaitTime(waitTime);
} else {
allocatedTill.set(0, allocated);
allocatedWork.setAllocatedTime(allocated - startTime);
allocatedWork.setWaitTime(waitTime);
}
}
return allocatedWork;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy