Просмотр исходного кода

* added a InRootSetFunc class for clients to add own packages to the mark'n'sweep root set

Michael Vogt лет назад: 21
Родитель
Сommit
331956f9b5
2 измененных файлов с 18 добавлено и 6 удалено
  1. 8 2
      apt-pkg/algorithms.cc
  2. 10 4
      apt-pkg/algorithms.h

+ 8 - 2
apt-pkg/algorithms.cc

@@ -1342,8 +1342,14 @@ pkgMarkAlwaysInclude(pkgCache::PkgIterator p, vector<regex_t*> alwaysMark)
    return false;
 }
 
+bool pkgMarkUsed(pkgDepCache &Cache)
+{
+   InRootSetFunc f;
+   return pkgMarkUsed(Cache, f);
+}
+
 // the main mark algorithm
-bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func)
+bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc &userFunc)
 {
    bool follow_recommends;
    bool follow_suggests;
@@ -1394,7 +1400,7 @@ bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func)
    // do the mark part, this is the core bit of the algorithm
    for(pkgCache::PkgIterator p=Cache.PkgBegin(); !p.end(); ++p)
    {
-      if( (func != NULL ? (*func)(p) : false) ||
+      if( userFunc.InRootSet(p) ||
 	   pkgMarkAlwaysInclude(p, neverAutoRemoveRegexp) ||
 	 !(Cache[p].Flags & pkgCache::Flag::Auto) ||
 	  (p->Flags & pkgCache::Flag::Essential))

+ 10 - 4
apt-pkg/algorithms.h

@@ -134,10 +134,16 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache);
 void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List);
 
 
-// callback function that can be used by the client to bring in
+// class that can be subclassed by the client to bring in
 // certain own packages into the root set (if the client returns
 // True the package will be considered as part of the root set)
-typedef bool (*InRootSetFunc)(pkgCache::PkgIterator);
+class InRootSetFunc
+{
+ public:
+   virtual bool InRootSet(const pkgCache::PkgIterator &pkg) {return false;};
+   virtual ~InRootSetFunc() {};
+};
+
 
 // Mark all reachable packages with "pkgDepCache::StateCache.Marked=1"
 // the root-set are all essential packages+everything that was not 
@@ -147,7 +153,7 @@ typedef bool (*InRootSetFunc)(pkgCache::PkgIterator);
 // is usefull for clients that have there own idea about the root-set
 // 
 // Everything that is not reach can be removed
-bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc f=NULL);
-		 
+bool pkgMarkUsed(pkgDepCache &Cache);
+bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc &f);
 		     
 #endif