solver: convert some package state flags to bitfields

cute-signatures
Timo Teräs 2012-02-16 21:46:09 +02:00
parent 706664c178
commit 4bc8add78d
1 changed files with 13 additions and 11 deletions

View File

@ -26,8 +26,6 @@
#define APK_PKGSTF_NOINSTALL 0 #define APK_PKGSTF_NOINSTALL 0
#define APK_PKGSTF_INSTALL 1 #define APK_PKGSTF_INSTALL 1
#define APK_PKGSTF_ALT_BRANCH 2 #define APK_PKGSTF_ALT_BRANCH 2
#define APK_PKGSTF_INSTALLIF 4
#define APK_PKGSTF_DECIDED 8
struct apk_score { struct apk_score {
unsigned short unsatisfiable; unsigned short unsatisfiable;
@ -42,7 +40,9 @@ struct apk_package_state {
unsigned availability_checked : 1; unsigned availability_checked : 1;
unsigned unavailable : 1; unsigned unavailable : 1;
unsigned install_applied : 1; unsigned install_applied : 1;
unsigned flags : 4; unsigned handle_install_if : 1;
unsigned locked : 1;
unsigned flags : 2;
}; };
struct apk_name_state { struct apk_name_state {
@ -411,7 +411,7 @@ static int get_preference(struct apk_solver_state *ss,
if (installable_only && if (installable_only &&
(ss->topology_position < pkg0->topology_hard || (ss->topology_position < pkg0->topology_hard ||
(ps0->flags & APK_PKGSTF_DECIDED))) ps0->locked))
continue; continue;
r = compare_package_preference(name_flags, r = compare_package_preference(name_flags,
@ -498,7 +498,7 @@ static int update_name_state(struct apk_solver_state *ss, struct apk_name *name)
if (ps0 == NULL || if (ps0 == NULL ||
ss->topology_position < pkg0->topology_hard || ss->topology_position < pkg0->topology_hard ||
(ps0->flags & APK_PKGSTF_DECIDED) || ps0->locked ||
check_if_package_unavailable(ss, pkg0)) check_if_package_unavailable(ss, pkg0))
continue; continue;
@ -673,7 +673,7 @@ static void undo_decision(struct apk_solver_state *ss,
dbg_printf("-->undo_decision: " PKG_VER_FMT " %s\n", PKG_VER_PRINTF(pkg), dbg_printf("-->undo_decision: " PKG_VER_FMT " %s\n", PKG_VER_PRINTF(pkg),
(ps->flags & APK_PKGSTF_INSTALL) ? "INSTALL" : "NO_INSTALL"); (ps->flags & APK_PKGSTF_INSTALL) ? "INSTALL" : "NO_INSTALL");
if (ps->flags & APK_PKGSTF_INSTALLIF) if (ps->handle_install_if)
ss->topology_position = ps->topology_soft; ss->topology_position = ps->topology_soft;
else else
ss->topology_position = pkg->topology_hard; ss->topology_position = pkg->topology_hard;
@ -705,15 +705,16 @@ static solver_result_t push_decision(struct apk_solver_state *ss, struct apk_pac
struct apk_package_state *ps = pkg_to_ps(pkg); struct apk_package_state *ps = pkg_to_ps(pkg);
ps->backtrack = ss->latest_decision; ps->backtrack = ss->latest_decision;
ps->flags = flags | APK_PKGSTF_DECIDED; ps->locked = 1;
ps->flags = flags;
ps->saved_score = ss->score; ps->saved_score = ss->score;
if (ps->topology_soft < ss->topology_position) { if (ps->topology_soft < ss->topology_position) {
if (flags & APK_PKGSTF_INSTALL) if (flags & APK_PKGSTF_INSTALL)
ps->flags |= APK_PKGSTF_INSTALLIF; ps->handle_install_if = 1;
ss->topology_position = ps->topology_soft; ss->topology_position = ps->topology_soft;
} else { } else {
ps->flags &= ~APK_PKGSTF_INSTALLIF; ps->handle_install_if = 0;
ss->topology_position = pkg->topology_hard; ss->topology_position = pkg->topology_hard;
} }
ss->latest_decision = pkg; ss->latest_decision = pkg;
@ -723,7 +724,7 @@ static solver_result_t push_decision(struct apk_solver_state *ss, struct apk_pac
ss->score.unsatisfiable, ss->score.unsatisfiable,
ss->score.preference); ss->score.preference);
if (ps->flags & APK_PKGSTF_INSTALLIF) if (ps->handle_install_if)
dbg_printf("triggers due to " PKG_VER_FMT "\n", dbg_printf("triggers due to " PKG_VER_FMT "\n",
PKG_VER_PRINTF(pkg)); PKG_VER_PRINTF(pkg));
@ -742,7 +743,8 @@ static int next_branch(struct apk_solver_state *ss)
if (ps->flags & APK_PKGSTF_ALT_BRANCH) { if (ps->flags & APK_PKGSTF_ALT_BRANCH) {
dbg_printf("-->next_branch: undo decision at topology_position %d\n", dbg_printf("-->next_branch: undo decision at topology_position %d\n",
ss->topology_position); ss->topology_position);
ps->flags &= ~(APK_PKGSTF_ALT_BRANCH | APK_PKGSTF_DECIDED); ps->flags &= ~APK_PKGSTF_ALT_BRANCH;
ps->locked = 0;
undo_decision(ss, pkg, ps); undo_decision(ss, pkg, ps);
ss->latest_decision = ps->backtrack; ss->latest_decision = ps->backtrack;