Scheduler
newJob.cpp
Go to the documentation of this file.
1 
10 #include "newJob.h"
11 
12 #include <atomic>
13 #include <cassert>
14 #include <thread>
15 
16 #include <scheduler/process.h>
17 #include <scheduler/system.h>
19 
20 #include "missedDeadline.h"
21 
22 using namespace Scheduler;
23 
24 
25 std::atomic<bool> NewJob::startEventScheduling(false);
26 NewJob *NewJob::processBeingCreated(nullptr);
27 
29 {
30  initEventSchedulingThread();
31 }
32 
33 void NewJob::initEventSchedulingThread()
34 {
35 #if 0
36  startEventScheduling = false;
37  static std::thread nextEventSchedulingThread(eventSchedulingThreadFunction);
38  processBeingCreated = nullptr;
39  nextEventSchedulingThread.detach();
40 #endif
41 }
42 
43 void NewJob::eventSchedulingThreadFunction()
44 {
45  while (true)
46  {
47  while(!startEventScheduling)
48  ;
49  processBeingCreated->scheduleNextEvent();
50  startEventScheduling = false;
51  }
52 }
53 
54 
56 {
57  assert(task != nullptr);
58  if (task == nullptr) //this should not happen
59  task = createTask();
61  task->setDeadlineTimeFromStartTime(time);
62  processBeingCreated = this;
63  //startEventScheduling = true;
64  print();
66  processBeingCreated->scheduleNextEvent();
67  //while (startEventScheduling)
68  // ;
69  return;
70 }
71 
72 std::string NewJob::getName()
73 {
74  return "New job";
75 }
76 
77 /*This is not used normally*/
78 std::shared_ptr<Process> NewJob::createTask()
79 {
80  double deadline = 30.0;
81  std::shared_ptr<Process> p = Process::createRealTimeTask(10.0, 35.0, deadline,
82  ((pid != -1) ? pid:Process::getNewPid()));
83 
84  return p;
85 }
86 
87 void NewJob::scheduleNextEvent()
88 {
89  //std::cerr << "scheduling next event\n";
90  if(renew)
91  {
92  std::shared_ptr<NewJob> e = std::make_shared<NewJob>(time + task->getPeriod(), true);
93  std::shared_ptr<Process> newTask = Process::createNextJob(*task);
94  assert(newTask != nullptr);
95  e->setTask(newTask);
97  }
98 
99  /*also schedule the missed deadline event.*/
100  scheduleMissedDeadlineEvent();
101 }
102 
103 void NewJob::scheduleMissedDeadlineEvent()
104 {
105  std::shared_ptr<MissedDeadline> d = std::make_shared<MissedDeadline>(task->getDeadlineTime());
106  d->setTask(task);
108 }
109 
110 
std::string getName() override
get the name of the event
Definition: newJob.cpp:72
std::shared_ptr< Process > task
Definition: event.h:60
virtual void print()
print information about the event
Definition: event.cpp:41
void queueProcess(std::shared_ptr< Process > p)
Definition: newProcess.cpp:21
static std::shared_ptr< Process > createRealTimeTask(double wcet, double T, double dl, int pid, int priority=0, double bcet=0.0)
creates a real time task
Definition: process.cpp:67
static System * getInstance()
Definition: system.cpp:28
static int getNewPid()
returns new process identifier. The value returned gets incremented at each call
Definition: process.cpp:88
void scheduleTask(TriggeringEvent trigger)
This function is the scheduler. When called, it schedule the task to be executed on the processor ama...
void process() override
handle the the event TODO: &#39;process&#39; is maybe not the best word for that, given that our simulator ac...
Definition: newJob.cpp:55
TaskScheduler * getScheduler()
returns the task scheduler object
Definition: system.cpp:110
static void init()
Definition: newJob.cpp:28
std::shared_ptr< Event > insert(std::shared_ptr< Event > e)
Definition: eventList.cpp:56
static std::shared_ptr< Process > createNextJob(const Process &task)
create the next job for a task
Definition: process.cpp:31
bool renew
Definition: event.h:59
TriggeringEvent eventType
The event type is need by the scheduling discipline, to determine if this kind of event triggers invo...
Definition: event.h:64
static EventList * getInstance()
Singleton pattern.
Definition: eventList.cpp:22
double time
Definition: event.h:58