From: Michael Schroeder Date: Fri, 5 Apr 2013 13:51:36 +0000 (+0200) Subject: make queue_insertn more flexible X-Git-Tag: BASE-SuSE-Code-12_3-Branch~68 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91d23d51236a02edd97c9a1f043dbd186210d6e4;p=thirdparty%2Flibsolv.git make queue_insertn more flexible Yes, it's an API change, but I'm pretty sure that nobody other than the solver itself uses queue_insertn. --- diff --git a/src/queue.c b/src/queue.c index 60b17491..37ea381a 100644 --- a/src/queue.c +++ b/src/queue.c @@ -153,7 +153,7 @@ queue_delete2(Queue *q, int pos) } void -queue_insertn(Queue *q, int pos, int n) +queue_insertn(Queue *q, int pos, int n, Id *elements) { if (n <= 0) return; @@ -171,7 +171,10 @@ queue_insertn(Queue *q, int pos, int n) } if (pos < q->count) memmove(q->elements + pos + n, q->elements + pos, (q->count - pos) * sizeof(Id)); - memset(q->elements + pos, 0, n * sizeof(Id)); + if (elements) + memcpy(q->elements + pos, elements, n * sizeof(Id)); + else + memset(q->elements + pos, 0, n * sizeof(Id)); q->left -= n; q->count += n; } diff --git a/src/queue.h b/src/queue.h index a80cd061..16f2cc62 100644 --- a/src/queue.h +++ b/src/queue.h @@ -114,7 +114,7 @@ extern void queue_free(Queue *q); extern void queue_insert(Queue *q, int pos, Id id); extern void queue_insert2(Queue *q, int pos, Id id1, Id id2); -extern void queue_insertn(Queue *q, int pos, int n); +extern void queue_insertn(Queue *q, int pos, int n, Id *elements); extern void queue_delete(Queue *q, int pos); extern void queue_delete2(Queue *q, int pos); extern void queue_deleten(Queue *q, int pos, int n); diff --git a/src/repo.c b/src/repo.c index c5a4a2d3..146df07f 100644 --- a/src/repo.c +++ b/src/repo.c @@ -1566,9 +1566,7 @@ repo_set_deparray(Repo *repo, Id p, Id keyname, Queue *q, Id marker) { if (q2.count) queue_insert(&q2, 0, -marker); - queue_insertn(&q2, 0, q->count); - for (i = 0; i < q->count; i++) - q2.elements[i] = q->elements[i]; + queue_insertn(&q2, 0, q->count, q->elements); } repo_set_deparray(repo, p, keyname, &q2, 0); queue_free(&q2); diff --git a/src/rules.c b/src/rules.c index 9b41ccd1..cb1b421a 100644 --- a/src/rules.c +++ b/src/rules.c @@ -3538,7 +3538,7 @@ solver_get_unneeded(Solver *solv, Queue *unneededq, int filtered) */ /* leave first element zero to make things easier */ /* also add trailing zero */ - queue_insertn(&edges, 0, 1 + count + 1); + queue_insertn(&edges, 0, 1 + count + 1, 0); /* first requires and recommends */ for (i = 0; i < count; i++) diff --git a/src/solver.c b/src/solver.c index 64b8376e..f5a7324a 100644 --- a/src/solver.c +++ b/src/solver.c @@ -2818,7 +2818,7 @@ transform_update_targets(Solver *solv) } if (update_targets->count > 2) solv_sort(update_targets->elements, update_targets->count >> 1, 2 * sizeof(Id), transform_update_targets_sortfn, solv); - queue_insertn(update_targets, 0, installed->end - installed->start); + queue_insertn(update_targets, 0, installed->end - installed->start, 0); lastp = lastq = 0; for (i = j = installed->end - installed->start; i < update_targets->count; i += 2) { @@ -2956,10 +2956,7 @@ solver_solve(Solver *solv, Queue *job) queue_init_clone(&solv->job, job); solv->pooljobcnt = pool->pooljobs.count; if (pool->pooljobs.count) - { - queue_insertn(&solv->job, 0, pool->pooljobs.count); - memcpy(solv->job.elements, pool->pooljobs.elements, pool->pooljobs.count * sizeof(Id)); - } + queue_insertn(&solv->job, 0, pool->pooljobs.count, pool->pooljobs.elements); job = &solv->job; /* free old stuff */ diff --git a/src/transaction.c b/src/transaction.c index c65606de..071f1563 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -1957,7 +1957,7 @@ transaction_add_obsoleted(Transaction *trans) return; /* make room */ steps = &trans->steps; - queue_insertn(steps, 0, max); + queue_insertn(steps, 0, max, 0); /* now add em */ map_init(&done, installed->end - installed->start);