diff options
Diffstat (limited to 'sta.py')
| -rwxr-xr-x | sta.py | 88 |
1 files changed, 88 insertions, 0 deletions
| @@ -111,6 +111,94 @@ class Trace: | |||
| 111 | print("") | 111 | print("") |
| 112 | 112 | ||
| 113 | 113 | ||
| 114 | ################## | ||
| 115 | # EDF class # | ||
| 116 | ################## | ||
| 117 | |||
| 118 | class EDF: | ||
| 119 | """Object representing an EDF test""" | ||
| 120 | |||
| 121 | def __init__(self,trace_files): | ||
| 122 | """Create an EDF test""" | ||
| 123 | self.trace_files = trace_files | ||
| 124 | |||
| 125 | def run_test(self): | ||
| 126 | |||
| 127 | #Build a trace of releases | ||
| 128 | release_trace = Trace(self.trace_files) | ||
| 129 | release_trace.filter('type==3') | ||
| 130 | release_trace.filter('type==3') | ||
| 131 | release_trace.sort('release_time') | ||
| 132 | releases = list(release_trace.iter) | ||
| 133 | print(str(len(releases))) | ||
| 134 | #This is a hack for the g6 set to get rid of initial job2 releases | ||
| 135 | releases = releases[28:] | ||
| 136 | print(str(len(releases))) | ||
| 137 | |||
| 138 | #Build a trace of scheduler events (only type 5, 6, and 7) | ||
| 139 | events_trace = Trace(self.trace_files) | ||
| 140 | events_trace.filter('type!=1') | ||
| 141 | events_trace.filter('type!=2') | ||
| 142 | events_trace.filter('type!=3') | ||
| 143 | events_trace.filter('type!=4') | ||
| 144 | events_trace.filter('type!=8') | ||
| 145 | events_trace.filter('type!=9') | ||
| 146 | events_trace.filter('type!=10') | ||
| 147 | events_trace.sort('when') | ||
| 148 | events = list(events_trace.iter) | ||
| 149 | |||
| 150 | #Do the test | ||
| 151 | started_releases = [] | ||
| 152 | num_errors = 0 | ||
| 153 | for event in events: | ||
| 154 | #StSwitchToData | ||
| 155 | if event['type'] == 5: | ||
| 156 | i = 0 | ||
| 157 | while True: | ||
| 158 | if (event['pid'] == releases[i]['pid'] and | ||
| 159 | event['job'] == releases[i]['job']): | ||
| 160 | started_releases.append(releases[i]) | ||
| 161 | print("="*50) | ||
| 162 | print("Valid SwitchTo:") | ||
| 163 | print(event) | ||
| 164 | print(releases[i]) | ||
| 165 | break | ||
| 166 | elif(releases[i]['release_time'] == | ||
| 167 | releases[i+1]['release_time']): | ||
| 168 | i += 1 | ||
| 169 | #print("Trying next...") | ||
| 170 | continue | ||
| 171 | else: | ||
| 172 | num_errors += 1 | ||
| 173 | print("="*50) | ||
| 174 | print('Invalid SwitchTo:') | ||
| 175 | print(event) | ||
| 176 | print(releases[0]) | ||
| 177 | print('Try counter: ' + str(i)) | ||
| 178 | break | ||
| 179 | #StSwitchAwayData | ||
| 180 | elif event['type'] == 6: | ||
| 181 | #Try to find the release among those started; | ||
| 182 | def func(release): | ||
| 183 | return (release['job'] == event['job'] and | ||
| 184 | release['pid'] == event['pid']) | ||
| 185 | possible_release = list(filter(func,started_releases)) | ||
| 186 | #Only take action if found (it may just be carrying over from | ||
| 187 | # previous job, in which case it's already on the releases | ||
| 188 | # list) | ||
| 189 | if len(possible_release) > 0: | ||
| 190 | release = possible_release[0] | ||
| 191 | releases.append(release) | ||
| 192 | def sortfunc(release): | ||
| 193 | return release['release_time'] | ||
| 194 | releases = sorted(releases,key=func) | ||
| 195 | #input("Continue?") | ||
| 196 | |||
| 197 | #Test completed | ||
| 198 | print("Test completed!") | ||
| 199 | print("Number of errors: " + str(num_errors)) | ||
| 200 | |||
| 201 | |||
| 114 | #################################### | 202 | #################################### |
| 115 | # Types for binary data conversion # | 203 | # Types for binary data conversion # |
| 116 | #################################### | 204 | #################################### |
