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 |
