- post = talloc(ctx, struct depend);
- post->file = needs_file;
- post->op = needs_opnum;
- list_add(&op[satisfies_file][satisfies_opnum].post, &post->list);
-
- pre = talloc(ctx, struct depend);
- pre->file = satisfies_file;
- pre->op = satisfies_opnum;
- list_add(&op[needs_file][needs_opnum].pre, &pre->list);
-
- dep_count++;
-}
-
-#if TRAVERSALS_TAKE_TRANSACTION_LOCK
-struct traverse_dep {
- unsigned int file;
- unsigned int op_num;
- const struct op *op;
-};
-
-/* Sort by which one runs first. */
-static int compare_traverse_dep(const void *_a, const void *_b)
-{
- const struct traverse_dep *a = _a, *b = _b;
- const struct traverse *trava = a->op->trav, *travb = b->op->trav;
-
- if (a->op->serial != b->op->serial)
- return a->op->serial - b->op->serial;
-
- /* If they have same serial, it means one didn't make any changes.
- * Thus sort by end in that case. */
- return a->op[trava->end - a->op_num].serial
- - b->op[travb->end - b->op_num].serial;
-}
-
-/* Traversals can deadlock against each other. Force order. */
-static void make_traverse_depends(char *filename[],
- struct op *op[], unsigned int num_ops[],
- unsigned int num)
-{
- unsigned int i, j, num_traversals = 0;
- struct traverse_dep *dep;
-
- dep = talloc_array(NULL, struct traverse_dep, 1);
-
- /* Count them. */
- for (i = 0; i < num; i++) {
- for (j = 0; j < num_ops[i]; j++) {
- if (op[i][j].op == OP_TDB_TRAVERSE_START
- || op[i][j].op == OP_TDB_TRAVERSE_READ_START) {
- dep = talloc_realloc(NULL, dep,
- struct traverse_dep,
- num_traversals+1);
- dep[num_traversals].file = i;
- dep[num_traversals].op_num = j;
- dep[num_traversals].op = &op[i][j];
- num_traversals++;
- }
- }
- }
- qsort(dep, num_traversals, sizeof(dep[0]), compare_traverse_dep);
- for (i = 1; i < num_traversals; i++) {
- /* i depends on end of traverse i-1. */
- add_dependency(NULL, op, filename, dep[i].file, dep[i].op_num,
- dep[i-1].file, dep[i-1].op->trav->end);
- }
- talloc_free(dep);
- printf("Dep count after traverses: %u\n", dep_count);
+ /* If you depend on a transaction, you actually depend on it ending. */
+ if (is_transaction(&op[satisfies_file][satisfies_opnum])) {
+ satisfies_opnum
+ += op[satisfies_file][satisfies_opnum].group_len;
+#if DEBUG_DEPS
+ printf("-> Actually end of transaction %s:%u\n",
+ filename[satisfies_file], satisfies_opnum+1);
+#endif
+ } else
+ /* We should never create a dependency from middle of
+ * a transaction. */
+ assert(!in_transaction(op[satisfies_file], satisfies_opnum)
+ || op[satisfies_file][satisfies_opnum].op
+ == OP_TDB_TRANSACTION_COMMIT
+ || op[satisfies_file][satisfies_opnum].op
+ == OP_TDB_TRANSACTION_CANCEL);
+
+ assert(op[needs_file][needs_opnum].op != OP_TDB_TRAVERSE);
+ assert(op[satisfies_file][satisfies_opnum].op != OP_TDB_TRAVERSE);
+
+ dep = talloc(ctx, struct depend);
+ dep->needs_file = needs_file;
+ dep->needs_opnum = needs_opnum;
+ dep->satisfies_file = satisfies_file;
+ dep->satisfies_opnum = satisfies_opnum;
+ 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);