return 0;
}
-static unsigned int dep_count;
static void add_dependency(void *ctx,
struct op *op[],
char *filename[],
list_add(&op[satisfies_file][satisfies_opnum].post, &dep->post_list);
list_add(&op[needs_file][needs_opnum].pre, &dep->pre_list);
talloc_set_destructor(dep, destroy_depend);
-
- dep_count++;
}
#if TRAVERSALS_TAKE_TRANSACTION_LOCK
dep[i-1].file, dep[i-1].op->trav->end);
}
talloc_free(dep);
- printf("Dep count after traverses: %u\n", dep_count);
}
#endif /* TRAVERSALS_TAKE_TRANSACTION_LOCK */
}
}
+/* This is simple, but not complete. We don't take into account
+ * indirect dependencies. */
+static void optimize_dependencies(struct op *op[], unsigned int num_ops[],
+ unsigned int num)
+{
+ unsigned int i, j;
+
+ for (i = 0; i < num; i++) {
+ int deps[num];
+
+ for (j = 0; j < num; j++)
+ deps[j] = -1;
+
+ for (j = 1; j < num_ops[i]; j++) {
+ struct depend *dep, *next;
+
+ list_for_each_safe(&op[i][j].pre, dep, next, pre_list) {
+ if (deps[dep->satisfies_file]
+ >= (int)dep->satisfies_opnum)
+ talloc_free(dep);
+ else
+ deps[dep->satisfies_file]
+ = dep->satisfies_opnum;
+ }
+ }
+ }
+}
+
static void derive_dependencies(char *filename[],
struct op *op[], unsigned int num_ops[],
unsigned int num)
hash[h].user[prev].op_num);
}
}
- printf("Dep count after deriving: %u\n", dep_count);
#if TRAVERSALS_TAKE_TRANSACTION_LOCK
make_traverse_depends(filename, op, num_ops, num);
#endif
+
+ optimize_dependencies(op, num_ops, num);
}
int main(int argc, char *argv[])