From c0405807b7f7f75fa1cf93265e6b2a739e449596 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 18 Apr 2013 17:42:23 -0400 Subject: Switched sched_trace data to verbose ctypes structs. --- parse/sched.py | 136 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 79 insertions(+), 57 deletions(-) (limited to 'parse/sched.py') diff --git a/parse/sched.py b/parse/sched.py index a38c61b..b56324b 100644 --- a/parse/sched.py +++ b/parse/sched.py @@ -7,6 +7,7 @@ import subprocess from collections import defaultdict,namedtuple from common import recordtype from point import Measurement +from ctypes import * class TimeTracker: '''Store stats for durations of time demarcated by sched_trace records.''' @@ -38,33 +39,30 @@ class TimeTracker: TaskParams = namedtuple('TaskParams', ['wcet', 'period', 'cpu']) TaskData = recordtype('TaskData', ['params', 'jobs', 'blocks', 'misses']) -# Map of event ids to corresponding class, binary format, and processing methods -RecordInfo = namedtuple('RecordInfo', ['clazz', 'fmt', 'method']) -record_map = [0]*10 +# Map of event ids to corresponding class and format +record_map = {} -# Common to all records -HEADER_FORMAT = ' arecord.when: + for (i, (brecord, _)) in enumerate(buff): + if get_time(brecord) > get_time(arecord): break - buff.insert(i, (arecord, method, itera)) + buff.insert(i, (arecord, itera)) for fname in fnames: itera = make_iterator(fname) add_record(itera) while buff: - (record, method, itera) = buff.pop(0) + record, itera = buff.pop(0) add_record(itera) - method(task_dict, record) + record.process(task_dict) + +class SchedRecord(object): + # Subclasses will have their FIELDs merged into this one + FIELDS = [('type', c_uint8), ('cpu', c_uint8), + ('pid', c_uint16), ('job', c_uint32)] + + def fill(self, data): + memmove(addressof(self), data, RECORD_SIZE) + + def process(self, task_dict): + raise NotImplementedError() + +class ParamRecord(SchedRecord): + FIELDS = [('wcet', c_uint32), ('period', c_uint32), + ('phase', c_uint32), ('partition', c_uint8)] + + def process(self, task_dict): + params = TaskParams(self.wcet, self.period, self.partition) + task_dict[self.pid].params = params + +class ReleaseRecord(SchedRecord): + FIELDS = [('when', c_uint64), ('release', c_uint64)] + + def process(self, task_dict): + data = task_dict[self.pid] + data.jobs += 1 + if data.params: + data.misses.start_time(self, self.when + data.params.period) + +class CompletionRecord(SchedRecord): + FIELDS = [('when', c_uint64)] -def process_completion(task_dict, record): - task_dict[record.pid].misses.store_time(record) + def process(self, task_dict): + task_dict[self.pid].misses.store_time(self) -def process_release(task_dict, record): - data = task_dict[record.pid] - data.jobs += 1 - if data.params: - data.misses.start_time(record, record.when + data.params.period) +class BlockRecord(SchedRecord): + FIELDS = [('when', c_uint64)] -def process_param(task_dict, record): - params = TaskParams(record.wcet, record.period, record.partition) - task_dict[record.pid].params = params + def process(self, task_dict): + task_dict[self.pid].blocks.start_time(self) -def process_block(task_dict, record): - task_dict[record.pid].blocks.start_time(record) +class ResumeRecord(SchedRecord): + FIELDS = [('when', c_uint64)] -def process_resume(task_dict, record): - task_dict[record.pid].blocks.store_time(record) + def process(self, task_dict): + task_dict[self.pid].blocks.store_time(self) -register_record('ResumeRecord', 9, process_resume, 'Q8x', ['when']) -register_record('BlockRecord', 8, process_block, 'Q8x', ['when']) -register_record('CompletionRecord', 7, process_completion, 'Q8x', ['when']) -register_record('ReleaseRecord', 3, process_release, 'QQ', ['when', 'release']) -register_record('ParamRecord', 2, process_param, 'IIIcc2x', - ['wcet','period','phase','partition', 'task_class']) +# Map records to sched_trace ids (see include/litmus/sched_trace.h +register_record(2, ParamRecord) +register_record(3, ReleaseRecord) +register_record(7, CompletionRecord) +register_record(8, BlockRecord) +register_record(9, ResumeRecord) def create_task_dict(data_dir, work_dir = None): '''Parse sched trace files''' -- cgit v1.2.2