From: Panu Matilainen Date: Tue, 18 Nov 2008 04:58:13 +0000 (+0200) Subject: Lazy allocation of FSM for file info sets X-Git-Tag: tznext/4.11.0.1.tizen20130304~3420 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=03d0f43f0bf4d2883a822277c7a9ae2936b3a699;p=tools%2Flibrpm-tizen.git Lazy allocation of FSM for file info sets - new more or less internal rpmfiFSM() to create FSM on demand, move mapflags calculation there --- diff --git a/build/pack.c b/build/pack.c index e0860c2..29e1d05 100644 --- a/build/pack.c +++ b/build/pack.c @@ -44,12 +44,12 @@ static rpmRC cpio_doio(FD_t fdo, Header h, CSA_t csa, if (cfd == NULL) return RPMRC_FAIL; - xx = fsmSetup(fi->fsm, FSM_PKGBUILD, ts, fi, cfd, + xx = fsmSetup(rpmfiFSM(fi), FSM_PKGBUILD, ts, fi, cfd, &csa->cpioArchiveSize, &failedFile); if (xx) rc = RPMRC_FAIL; (void) Fclose(cfd); - xx = fsmTeardown(fi->fsm); + xx = fsmTeardown(rpmfiFSM(fi)); if (rc == RPMRC_OK && xx) rc = RPMRC_FAIL; if (rc) { diff --git a/lib/psm.c b/lib/psm.c index 6b69d0e..58fa059 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -1357,13 +1357,13 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage) break; } - rc = fsmSetup(fi->fsm, FSM_PKGINSTALL, ts, fi, + rc = fsmSetup(rpmfiFSM(fi), FSM_PKGINSTALL, ts, fi, psm->cfd, NULL, &psm->failedFile); (void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_UNCOMPRESS), fdOp(psm->cfd, FDSTAT_READ)); (void) rpmswAdd(rpmtsOp(ts, RPMTS_OP_DIGEST), fdOp(psm->cfd, FDSTAT_DIGEST)); - xx = fsmTeardown(fi->fsm); + xx = fsmTeardown(rpmfiFSM(fi)); saveerrno = errno; /* XXX FIXME: Fclose with libio destroys errno */ xx = Fclose(psm->cfd); @@ -1415,9 +1415,9 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage) psm->total = fc; xx = rpmpsmNext(psm, PSM_NOTIFY); - rc = fsmSetup(fi->fsm, FSM_PKGERASE, ts, fi, + rc = fsmSetup(rpmfiFSM(fi), FSM_PKGERASE, ts, fi, NULL, NULL, &psm->failedFile); - xx = fsmTeardown(fi->fsm); + xx = fsmTeardown(rpmfiFSM(fi)); psm->what = RPMCALLBACK_UNINST_STOP; psm->amount = 0; /* XXX W2DO? looks wrong. */ @@ -1562,9 +1562,9 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage) if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_PKGCOMMIT)) break; if (rpmtsFlags(ts) & RPMTRANS_FLAG_APPLYONLY) break; - rc = fsmSetup(fi->fsm, FSM_PKGCOMMIT, ts, fi, + rc = fsmSetup(rpmfiFSM(fi), FSM_PKGCOMMIT, ts, fi, NULL, NULL, &psm->failedFile); - xx = fsmTeardown(fi->fsm); + xx = fsmTeardown(rpmfiFSM(fi)); break; case PSM_CHROOT_IN: diff --git a/lib/rpmfi.c b/lib/rpmfi.c index 376b635..8329e57 100644 --- a/lib/rpmfi.c +++ b/lib/rpmfi.c @@ -1214,7 +1214,6 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags) const char * Type; rpm_loff_t *asize = NULL; unsigned char * t; - cpioMapFlags mapflags; int isBuild, isSource; struct rpmtd_s fdigests, digalgo; struct rpmtd_s td; @@ -1318,23 +1317,6 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags) } } - /* XXX TR_REMOVED needs CPIO_MAP_{ABSOLUTE,ADDDOT} CPIO_ALL_HARDLINKS */ - - /* Figure out mapflags: - * - path, mode, uid and gid are used by everything - * - all binary packages get SBIT_CHECK set - * - if archive size is not known, we're only building this package, - * different rules apply - */ - mapflags = CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID; - if (isBuild) { - mapflags |= CPIO_MAP_TYPE; - if (isSource) mapflags |= CPIO_FOLLOW_SYMLINKS; - } else { - if (!isSource) mapflags |= CPIO_SBIT_CHECK; - } - fi->fsm = newFSM(mapflags); - _hgfi(h, RPMTAG_FILELINKTOS, &td, defFlags, fi->flinks); if (!(flags & RPMFI_NOFILELANGS)) { _hgfi(h, RPMTAG_FILELANGS, &td, defFlags, fi->flangs); @@ -1463,3 +1445,25 @@ void rpmfiSetFState(rpmfi fi, int ix, rpmfileState state) fi->fstates[ix] = state; } } + +FSM_t rpmfiFSM(rpmfi fi) +{ + if (fi != NULL && fi->fsm == NULL) { + cpioMapFlags mapflags; + /* Figure out mapflags: + * - path, mode, uid and gid are used by everything + * - all binary packages get SBIT_CHECK set + * - if archive size is not known, we're only building this package, + * different rules apply + */ + mapflags = CPIO_MAP_PATH | CPIO_MAP_MODE | CPIO_MAP_UID | CPIO_MAP_GID; + if (fi->fiflags & RPMFI_ISBUILD) { + mapflags |= CPIO_MAP_TYPE; + if (fi->fiflags & RPMFI_ISSOURCE) mapflags |= CPIO_FOLLOW_SYMLINKS; + } else { + if (!(fi->fiflags & RPMFI_ISSOURCE)) mapflags |= CPIO_SBIT_CHECK; + } + fi->fsm = newFSM(mapflags); + } + return (fi != NULL) ? fi->fsm : NULL; +} diff --git a/lib/rpmfi_internal.h b/lib/rpmfi_internal.h index a3cd33e..cf9a6aa 100644 --- a/lib/rpmfi_internal.h +++ b/lib/rpmfi_internal.h @@ -118,5 +118,7 @@ rpmfi rpmfiUpdateState(rpmfi fi, rpmts ts, rpmte p); RPM_GNUC_INTERNAL void rpmfiSetFState(rpmfi fi, int ix, rpmfileState state); +/* XXX can't be internal as build code needs this */ +FSM_t rpmfiFSM(rpmfi fi); #endif /* _RPMFI_INTERNAL_H */