[devel] [SCM] packages/apt: heads/rework-dynamic-mmap

Ivan Zakharyaschev imz на altlinux.org
Ср Янв 29 19:32:35 MSK 2020


On Wed, 29 Jan 2020, Ivan Zakharyaschev wrote:

> On Wed, 29 Jan 2020, Aleksei Nikiforov wrote:

> > Вот второй фрагмент изменений под вопросом:
> > 
> > > @@ -544,18 +562,24 @@ bool 
> > pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver,
> > >   #endif
> > >
> > >      // Get a structure
> > > -   unsigned long Provides = 
> > Owner->AllocateInMap(sizeof(pkgCache::Provides));
> > > -   if (Provides == 0)
> > > +   const auto Provides = 
> > Owner->AllocateInMap(sizeof(pkgCache::Provides));
> > > +   const auto idxVersion = Version.empty()
> > > +                         ? std::experimental::optional<unsigned long>()
> > > +                         : WriteString(Version);
> > > +   if (!Provides || (!Version.empty() && !idxVersion))
> > >         return false;
> > >      Cache.HeaderP->ProvidesCount++;
> > >
> > >      // Fill it in
> > > -   pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + 
> > Provides,Cache.PkgP);
> > > +   pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + 
> > *Provides,Cache.PkgP);
> > >      Prv->Version = Ver.Index();
> > >      Prv->NextPkgProv = Ver->ProvidesList;
> > >      Ver->ProvidesList = Prv.Index();
> > > -   if (Version.empty() == false && (Prv->ProvideVersion = 
> > WriteString(Version)) == 0)
> > > -      return false;
> > > +
> > > +   if (Version.empty() == false)
> > > +   {
> > > +      Prv->ProvideVersion = *idxVersion;
> > > +   }
> > >
> > >      // Locate the target package
> > >      pkgCache::PkgIterator Pkg;

У меня возник вопрос: а в случае, если Version.empty() истинно, нужно ли 
как-то заполнять Prv->ProvideVersion специально?

Раньше (то, что минусами отмечено) в таком случае Prv->ProvideVersion 
никак не трогали (потому что происходил shortcut в вычислении &&).

> > Здесь мне следующее условие кажется неоправданно усложнённым и трудночитаемым
> > по сравнение с кодом из моего изменения:
> > 
> > if (!Provides || (!Version.empty() && !idxVersion))
> > 
> > Конечно, за счёт этого в условии "if (Version.empty() == false)" код сокращён
> > заметно по сравнению с моей версией, но все те строки, хоть их было и больше,
> > были простыми. Замена их на несколько усложнённых строк - не то, что я выбрал
> > бы в данном случае. Или в данном случае я тоже пропустил какую-то причину
> > данного изменения?
> 
> Не то, чтобы есть практические причины, но вызывало удивление и вопрос в 
> твоей версии, что заполняется бессмысленное значение 0 в случае, если 
> довести эту "транзакцию" по выделению и заполнению памяти не удалось 
> довести успешно до конца:
> 
>     // Get a structure
>     const auto Provides = 
> Owner->AllocateInMap(sizeof(pkgCache::Provides));
> -   if (Provides == 0)
> +   if (!Provides)
>        return false;
>     Cache.HeaderP->ProvidesCount++;
>     
>     // Fill it in
> -   pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + Provides,Cache.PkgP);
> +   pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + *Provides,Cache.PkgP);
>     Dynamic<pkgCache::PrvIterator> DynPrv(Prv);
>     Prv->Version = Ver.Index();
>     Prv->NextPkgProv = Ver->ProvidesList;
>     Ver->ProvidesList = Prv.Index();
> -   if (Version.empty() == false && (Prv->ProvideVersion = WriteString(Version)) == 0)
> -      return false;
> +
> +   if (Version.empty() == false)
> +   {
> +      const auto idxVersion = WriteString(Version);
> +      if (!idxVersion)
> +      {
> +         Prv->ProvideVersion = 0;
> +         return false;
> +      }
> +
> +      Prv->ProvideVersion = *idxVersion;
> +   }
>  
> 
> Чтобы не было удивления от бессмысленного значения, я переписал так, как 
> ты увидел. Не люблю операции, которые какой-то мусор присваивают, просто 
> чтобы место чем-то заполнить.
> 
> В моём варианте Prv даже не конструируется и не начинает заполняться, если 
> не удалось выделить память в Map под строку Version. Это же понятнее и 
> лишних вопросов не вызвает: что потом с этой частично осмысленно 
> заполненной, частично незаполненной структурой произойдёт и кто её в таком 
> виде увидит дальше.


Подробная информация о списке рассылки Devel