aboutsummaryrefslogtreecommitdiffstats
path: root/src/ftsort.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ftsort.c')
-rw-r--r--src/ftsort.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/ftsort.c b/src/ftsort.c
index 42717fe..8ba0114 100644
--- a/src/ftsort.c
+++ b/src/ftsort.c
@@ -134,17 +134,21 @@ static void move_record(struct timestamp* target, struct timestamp* pos)
134 /* Refuse to violate task and CPU sequentiality: since CPUs and 134 /* Refuse to violate task and CPU sequentiality: since CPUs and
135 * tasks execute sequentially, it makes no sense to move a 135 * tasks execute sequentially, it makes no sense to move a
136 * timestamp before something recorded by the same task or 136 * timestamp before something recorded by the same task or
137 * CPU. */ 137 * CPU. Exception: TS_SEND_RESCHED_START is actually recorded
138 if (prev->cpu == pos->cpu || 138 * on a different CPU, so it is not subject to sequentiality
139 prev->pid == pos->pid) { 139 * constraints.*/
140 if (prev->event != TS_SEND_RESCHED_START &&
141 pos->event != TS_SEND_RESCHED_START &&
142 (prev->cpu == pos->cpu ||
143 (prev->pid == pos->pid && pos->pid != 0))) {
140 /* Bail out before we cause more disturbance to the 144 /* Bail out before we cause more disturbance to the
141 * stream. */ 145 * stream. */
142 aborted_moves++; 146 aborted_moves++;
143 if (want_verbose) 147 if (want_verbose)
144 printf("Sequentiality constraint: " 148 printf("Sequentiality constraint:\n"
145 "<ev:%s seq:%u pid:%u cpu:%u at %llu> " 149 "\t<ev:%s seq:%u pid:%u cpu:%u at %llu>\n"
146 "must come before " 150 "\tmust come before\n"
147 "<ev:%s seq:%u pid:%u cpu:%u at %llu>\n", 151 "\t<ev:%s seq:%u pid:%u cpu:%u at %llu>\n",
148 event2str(prev->event), 152 event2str(prev->event),
149 prev->seq_no, prev->pid, prev->cpu, 153 prev->seq_no, prev->pid, prev->cpu,
150 (unsigned long long) prev->timestamp, 154 (unsigned long long) prev->timestamp,
@@ -213,7 +217,8 @@ static void pre_check_cpu_monotonicity(struct timestamp *start,
213 prev[i] = pos[i] = NULL; 217 prev[i] = pos[i] = NULL;
214 218
215 for (next = start; next < end; next++) { 219 for (next = start; next < end; next++) {
216 if (next->event >= SINGLE_RECORDS_RANGE) 220 if (next->event >= SINGLE_RECORDS_RANGE ||
221 next->event == TS_SEND_RESCHED_START)
217 continue; 222 continue;
218 223
219 outlier = 0; 224 outlier = 0;