From 883f9dfe38ab081025220aafbf47f722b540d003 Mon Sep 17 00:00:00 2001 From: Gary Bressler Date: Tue, 9 Mar 2010 13:33:54 -0500 Subject: Preliminary, fairly workable version of unit_trace, including the visualizer. --- reader/trace_reader.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'reader/trace_reader.py') diff --git a/reader/trace_reader.py b/reader/trace_reader.py index a4ff964..831a06e 100644 --- a/reader/trace_reader.py +++ b/reader/trace_reader.py @@ -27,7 +27,12 @@ import struct - +############################################################################### +# Class definitions +############################################################################### +class InvalidRecordError(Exception): + pass + ############################################################################### # Public functions ############################################################################### @@ -49,15 +54,19 @@ def trace_reader(files): for file in files: file_iter = _get_file_iter(file) file_iters.append(file_iter) - file_iter_buff.append([file_iter.next()]) - + file_iter_buff.append([]) + # We keep 100 records in each buffer and then keep the buffer sorted # This is because records may have been recorded slightly out of order # This cannot guarantee records are produced in order, but it makes it # overwhelmingly probably. for x in range(0,len(file_iter_buff)): for y in range(0,100): - file_iter_buff[x].append(file_iters[x].next()) + try: + file_iter_buff[x].append(file_iters[x].next()) + except StopIteration: + break + for x in range(0,len(file_iter_buff)): file_iter_buff[x] = sorted(file_iter_buff[x],key=lambda rec: rec.when) @@ -96,7 +105,7 @@ def trace_reader(files): # Check for monotonically increasing time if last_time is not None and earliest.when < last_time: - exit("FATAL ERROR: trace_reader.py: out-of-order record produced") + raise InvalidRecordError("out-of-order record produced") else: last_time = earliest.when @@ -112,10 +121,12 @@ def _get_file_iter(file): f = open(file,'rb') while True: data = f.read(RECORD_HEAD_SIZE) + if data == '': + break try: type_num = struct.unpack_from('b',data)[0] except struct.error: - break #We read to the end of the file + raise InvalidRecordError("Invalid record detected, stopping.") type = _get_type(type_num) try: values = struct.unpack_from(StHeader.format + @@ -123,8 +134,7 @@ def _get_file_iter(file): record_dict = dict(zip(type.keys,values)) except struct.error: f.close() - print "Invalid record detected, stopping." - exit() + raise InvalidRecordError("Invalid record detected, stopping.") # Convert the record_dict into an object record = _dict2obj(record_dict) @@ -139,7 +149,7 @@ def _get_file_iter(file): # If there is no timestamp, set the time to 0 if 'when' not in record.__dict__.keys(): record.when = 0 - + yield record # Convert a dict into an object @@ -235,6 +245,8 @@ def _get_type(type_num): types = [None,StNameData,StParamData,StReleaseData,StAssignedData, StSwitchToData,StSwitchAwayData,StCompletionData,StBlockData, StResumeData,StSysReleaseData] + if type_num >= len(types) or type_num < 0: + raise InvalidRecordError("Invalid record detected, stopping.") return types[type_num] # Return the type name, given the type_num (this is simply a convenience to @@ -242,4 +254,6 @@ def _get_type(type_num): def _get_type_name(type_num): type_names = [None,"name","params","release","assign","switch_to", "switch_away","completion","block","resume","sys_release"] + if type_num >= len(type_names) or type_num < 0: + raise InvalidRecordError("Invalid record detected, stopping.") return type_names[type_num] -- cgit v1.2.2