diff options
author | Mac Mollison <mollison@cs.unc.edu> | 2010-04-03 18:44:12 -0400 |
---|---|---|
committer | Mac Mollison <mollison@cs.unc.edu> | 2010-04-03 18:44:12 -0400 |
commit | ae3ba00d4f644cc57ba784a7185466e07a561f01 (patch) | |
tree | 22bf2df9d3824d403466ed47a6199c77e347b6dd | |
parent | 13e0520cafd6280bcdf90208c699a6925efd9fba (diff) |
Added support for blocking
-rw-r--r-- | unit_trace/gedf_test.py | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/unit_trace/gedf_test.py b/unit_trace/gedf_test.py index 993e99a..0cab857 100644 --- a/unit_trace/gedf_test.py +++ b/unit_trace/gedf_test.py | |||
@@ -93,6 +93,24 @@ def gedf_test(stream): | |||
93 | if job.is_complete == False: | 93 | if job.is_complete == False: |
94 | eligible.append(job) | 94 | eligible.append(job) |
95 | 95 | ||
96 | # A job has been blocked. | ||
97 | elif record.type_name == 'block': | ||
98 | pos = _find_job(record,on_cpu) | ||
99 | # What if the job is blocked AFTER being switched away? | ||
100 | # This is a bug in some versions of LITMUS. | ||
101 | if pos is None: | ||
102 | pos = _find_job(record,eligible) | ||
103 | job = eligible[pos] | ||
104 | else: | ||
105 | job = on_cpu[pos] | ||
106 | job.is_blocked = True | ||
107 | |||
108 | # A job is resumed | ||
109 | elif record.type_name == 'resume': | ||
110 | pos = _find_job(record,eligible) | ||
111 | job = eligible[pos] | ||
112 | job.is_blocked = False | ||
113 | |||
96 | last_time = record.when | 114 | last_time = record.when |
97 | yield record | 115 | yield record |
98 | 116 | ||
@@ -107,6 +125,7 @@ class Job(object): | |||
107 | self.job = record.job | 125 | self.job = record.job |
108 | self.deadline = record.deadline | 126 | self.deadline = record.deadline |
109 | self.is_complete = False | 127 | self.is_complete = False |
128 | self.is_blocked = False | ||
110 | self.inversion_start = None | 129 | self.inversion_start = None |
111 | self.inversion_end = None | 130 | self.inversion_end = None |
112 | self.inversion_start_id = None | 131 | self.inversion_start_id = None |
@@ -147,12 +166,15 @@ def _gedf_check(eligible,on_cpu,when,m,first_event_this_timestamp): | |||
147 | # List of error records to be returned | 166 | # List of error records to be returned |
148 | errors = [] | 167 | errors = [] |
149 | 168 | ||
150 | # List of all jobs that are not complete | 169 | # List of all jobs that are contending for the CPU (neither complete nor |
170 | # blocked) | ||
151 | all = [] | 171 | all = [] |
152 | for x in on_cpu: | 172 | for x in on_cpu: |
153 | if x.is_complete is not True: | 173 | if x.is_complete is not True and x.is_blocked is not True: |
174 | all.append(x) | ||
175 | for x in eligible: | ||
176 | if x.is_blocked is not True: | ||
154 | all.append(x) | 177 | all.append(x) |
155 | all += eligible | ||
156 | 178 | ||
157 | # Sort by on_cpu and then by deadline. sort() is guaranteed to be stable. | 179 | # Sort by on_cpu and then by deadline. sort() is guaranteed to be stable. |
158 | # Thus, this gives us jobs ordered by deadline with preference to those | 180 | # Thus, this gives us jobs ordered by deadline with preference to those |