JobContext.java 3.64 KB
Newer Older
1
package mvd.jester.simulator.internals.dynamicforkjoin;
2 3

import java.util.Optional;
4
import mvd.jester.simulator.EventPrinter;
5 6 7
import mvd.jester.simulator.internals.JobContextInterface;
import mvd.jester.simulator.internals.ProcessorContext;
import mvd.jester.simulator.internals.TaskContextInterface;
8 9 10 11 12 13

/**
 * Job
 * 
 * @param <Job>
 */
14
public class JobContext implements JobContextInterface {
15 16 17 18 19

    private final TaskContext taskContext;
    private final SegmentContext segmentContext;
    private final long wcet;
    private Optional<ProcessorContext> currentProcessor;
20
    private Optional<TaskletContext> currentTasklet;
21 22 23 24


    public JobContext(TaskContext taskContext, SegmentContext segmentContext) {
        this.currentProcessor = Optional.empty();
25
        this.currentTasklet = Optional.empty();
26 27
        this.taskContext = taskContext;
        this.segmentContext = segmentContext;
28
        this.wcet = segmentContext.getSegment().getWidth();
29 30
    }

31
    public Optional<TaskContextInterface> updateExecution(long time) {
32 33 34 35 36 37
        boolean jobIsIdle = true;
        if (currentTasklet.isPresent()) {
            jobIsIdle = currentTasklet.get().updateExecution(time);
        }

        if (jobIsIdle) {
38
            currentTasklet = segmentContext.getNextTasklet();
39 40
            Optional<TaskContextInterface> tc = taskContext.acceptNotification(time);

41
            if (currentTasklet.isPresent()) {
42
                EventPrinter.print("Time " + time + ": Job " + this + " started executing tasklet "
43
                        + currentTasklet.get() + " on Processor " + currentProcessor.get());
44 45 46 47 48 49 50
                currentTasklet.get().setCurrentJob(this);
            } else {
                if (currentProcessor.isPresent()) {
                    currentProcessor.get().setJob(null);
                }
                currentProcessor = Optional.empty();
                return tc;
51
            }
52
        }
53

54
        return Optional.empty();
55 56 57
    }

    public boolean checkExecutionTime() {
58 59 60 61
        if (currentTasklet.isPresent()) {
            return currentTasklet.get().checkExecutionTime();
        }
        return false;
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
    }

    /**
     * @return the wcet
     */
    public long getWcet() {
        return wcet;
    }

    /**
     * @param processor the currentProcessor to set
     */
    public void setCurrentProcessor(ProcessorContext processor) {
        this.currentProcessor = Optional.ofNullable(processor);
    }

    /**
     * @return the currentProcessor
     */
    public Optional<ProcessorContext> getCurrentProcessor() {
        return currentProcessor;
    }

    /**
86 87 88 89 90 91 92
     * @param currentTasklet the currentTasklet to set
     */
    public void setCurrentTasklet(TaskletContext currentTasklet) {
        this.currentTasklet = Optional.ofNullable(currentTasklet);
    }

    /**
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
     * @return the segmentContext
     */
    public SegmentContext getSegmentContext() {
        return segmentContext;
    }


    /**
     * @return the taskContext
     */
    public TaskContext getTaskContext() {
        return taskContext;
    }

    @Override
    public String toString() {
109
        return "(of task=" + taskContext + ")";
110 111
    }

112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
    @Override
    public boolean prepareJob(long time) {
        if (!currentTasklet.isPresent()) {
            currentTasklet = segmentContext.getNextTasklet();
            if (currentTasklet.isPresent()) {
                currentTasklet.get().setCurrentJob(this);
                // EventPrinter.print("Time " + time + ": Job " + this + " started executing
                // tasklet"
                // + currentTasklet.get());
                return true;
            } else {
                return false;
            }
        }
        return true;
    }

129
}