Index: tools/cygprofile/mergetraces.py |
diff --git a/tools/cygprofile/mergetraces.py b/tools/cygprofile/mergetraces.py |
index f349ad3b885374cada16b86b1cc2c2ed2018f4da..93a00cacef21fa75c597a5aaed5b85aa3cc1a894 100755 |
--- a/tools/cygprofile/mergetraces.py |
+++ b/tools/cygprofile/mergetraces.py |
@@ -143,21 +143,30 @@ def GroupByProcessAndThreadId(input_trace): |
result each thread has its own contiguous segment of code (ordered by |
timestamp) and processes also have their code isolated (i.e. not interleaved). |
""" |
- def MakeTimestamp(usec, sec): |
- return usec * 1000000 + sec |
+ def MakeTimestamp(sec, usec): |
+ return sec * 1000000 + usec |
def PidAndTidFromString(pid_and_tid): |
strings = pid_and_tid.split(':') |
return (int(strings[0]), int(strings[1])) |
+ tid_to_pid_map = {} |
pid_first_seen = {} |
tid_first_seen = {} |
+ |
for (sec, usec, pid_and_tid, _) in input_trace: |
(pid, tid) = PidAndTidFromString(pid_and_tid) |
+ |
+ # Make sure that thread IDs are unique since this is a property we rely on. |
+ if tid_to_pid_map.setdefault(tid, pid) != pid: |
+ raise Exception( |
+ 'Seen PIDs %d and %d for TID=%d. Thread-IDs must be unique' % ( |
+ tid_to_pid_map[tid], pid, tid)) |
+ |
if not pid in pid_first_seen: |
- pid_first_seen[pid] = MakeTimestamp(usec, sec) |
+ pid_first_seen[pid] = MakeTimestamp(sec, usec) |
if not tid in tid_first_seen: |
- tid_first_seen[tid] = MakeTimestamp(usec, sec) |
+ tid_first_seen[tid] = MakeTimestamp(sec, usec) |
def CompareEvents(event1, event2): |
(sec1, usec1, pid_and_tid, _) = event1 |
@@ -171,7 +180,7 @@ def GroupByProcessAndThreadId(input_trace): |
tid_cmp = cmp(tid_first_seen[tid1], tid_first_seen[tid2]) |
if tid_cmp != 0: |
return tid_cmp |
- return cmp(MakeTimestamp(usec1, sec1), MakeTimestamp(usec2, sec2)) |
+ return cmp(MakeTimestamp(sec1, usec1), MakeTimestamp(sec2, usec2)) |
return sorted(input_trace, cmp=CompareEvents) |