/**
* This file is part of miniCDx benchmark of oSCJ.
*
* miniCDx is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* miniCDx is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with miniCDx. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2009, 2010
* @authors Daniel Tang, Ales Plsek
*
* See: http://sss.cs.purdue.edu/projects/oscj/
*/
package minicdj.cdx;
/**
* Noise generator for the detector. The generator lives in the persistent detector scope. Its constructor runs in the
* persistent detector scope. Noise is generated in the detector scope (and the allocated objects live in the detector
* scope).
*/
/*@javax.safetycritical.annotate.Scope("cdx.Level0Safelet")*/
/*@javax.safetycritical.annotate.RunsIn("cdx.CollisionDetectorHandler")*/
public class NoiseGenerator {
private Object[] noiseRoot;
private int noisePtr;
public NoiseGenerator() {
if (Constants.DETECTOR_NOISE) {
noiseRoot = new Object[Constants.DETECTOR_NOISE_REACHABLE_POINTERS];
noisePtr = 0;
}
}
private void generateNoise() {
for (int i = 0; i < Constants.DETECTOR_NOISE_ALLOCATE_POINTERS; i++) {
noiseRoot[(noisePtr++) % noiseRoot.length] = new byte[Constants.DETECTOR_NOISE_ALLOCATION_SIZE];
}
}
private void generateNoiseWithVariableObjectSize() {
int currentIncrement = 0;
int maxIncrement = Constants.DETECTOR_NOISE_MAX_ALLOCATION_SIZE - Constants.DETECTOR_NOISE_MIN_ALLOCATION_SIZE;
for (int i = 0; i < Constants.DETECTOR_NOISE_ALLOCATE_POINTERS; i++) {
noiseRoot[(noisePtr++) % noiseRoot.length] = new byte[Constants.DETECTOR_NOISE_MIN_ALLOCATION_SIZE
+ (currentIncrement % maxIncrement)];
currentIncrement += Constants.DETECTOR_NOISE_ALLOCATION_SIZE_INCREMENT;
}
}
public void generateNoiseIfEnabled() {
if (Constants.DETECTOR_NOISE) {
if (Constants.DETECTOR_NOISE_VARIABLE_ALLOCATION_SIZE) {
generateNoiseWithVariableObjectSize();
} else {
generateNoise();
}
}
}
}