]> git.saurik.com Git - apt.git/commitdiff
* merged the apt--main with the 2004 bwlimit tree
authorMichael Vogt <michael.vogt@ubuntu.com>
Thu, 31 Mar 2005 09:07:12 +0000 (09:07 +0000)
committerMichael Vogt <michael.vogt@ubuntu.com>
Thu, 31 Mar 2005 09:07:12 +0000 (09:07 +0000)
Patches applied:

 * michael.vogt@canonical.com--2004/apt--bwlimit--0--base-0
   tag of apt@packages.debian.org/apt--main--0--patch-47

 * michael.vogt@canonical.com--2004/apt--bwlimit--0--patch-1
   * fist attempt for bwlimit

 * michael.vogt@canonical.com--2004/apt--bwlimit--0--patch-2
   * add a nanosleep, making it less cpu intensive

 * michael.vogt@canonical.com--2004/apt--bwlimit--0--patch-3
   * use SingleInstance when DlLimit is activated

 * michael.vogt@canonical.com--2004/apt--bwlimit--0--patch-4
   * cleanups, no code changes

Makefile
apt-pkg/acquire.cc
debian/rules
methods/http.cc
methods/http.h

index 72cac61b5ec7f5833e401956be4364fae4eb2654..b35ad4a0d02dde2c4d4194d04a96e1e593f8e07c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,8 +17,8 @@ all headers library clean veryclean binary program doc dirs:
        $(MAKE) -C cmdline $@
        $(MAKE) -C ftparchive $@
        $(MAKE) -C dselect $@
-       $(MAKE) -C doc $@
-       $(MAKE) -C po $@
+#      $(MAKE) -C doc $@
+#      $(MAKE) -C po $@
 
 # Some very common aliases
 .PHONY: maintainer-clean dist-clean distclean pristine sanity 
index 70dce4f540a4ac23e047cd1e855cf4840cb01fca..212c8d52bfc2ba806993e94b76eb8f8855ed1929 100644 (file)
@@ -266,6 +266,10 @@ pkgAcquire::MethodConfig *pkgAcquire::GetConfig(string Access)
    if (Work.Start() == false)
       return 0;
    
+   /* if a method uses DownloadLimit, we switch to SingleInstance mode */
+   if(_config->FindI("Acquire::"+Access+"::DlLimit",0) > 0)
+      Conf->SingleInstance = true;
+   
    return Conf;
 }
                                                                        /*}}}*/
index e3254c2d28306d333b9002e11940fef16401c0bf..fdae46352c4f55f9c1af82d0684f5d7c53f12f68 100755 (executable)
@@ -36,7 +36,7 @@ endif
 # Default rule
 build:
 
-DEB_BUILD_PROG:=debuild --preserve-envvar PATH --preserve-envvar CCACHE_DIR -us -uc $(DEB_BUILD_PROG_OPTS)
+DEB_BUILD_PROG:=debuild --preserve-envvar PATH --preserve-envvar CCACHE_DIR -us -uc $(DEBUILD_DPKG_BUILDPACKAGE_OPTS)
 APT_DEBVER=$(shell dpkg-parsechangelog |sed -n -e '/^Version:/s/^Version: //p')
 APT_CONFVER=$(shell sed -n -e 's/^AC_DEFINE_UNQUOTED(VERSION,"\(.*\)")/\1/p' configure.in)
 APT_CVSTAG=$(shell echo "$(APT_DEBVER)" | sed -e 's/^/v/' -e 's/\./_/g')
index 81a64d7a3f1e769ddf58a45cecdf7e51c35873ba..27f0dafefb816bd959d0159ea67ebe9c9df010e2 100644 (file)
@@ -58,6 +58,12 @@ unsigned long PipelineDepth = 10;
 unsigned long TimeOut = 120;
 bool Debug = false;
 
+
+unsigned long CircleBuf::BwReadLimit=0;
+unsigned long CircleBuf::BwTickReadData=0;
+struct timeval CircleBuf::BwReadTick={0,0};
+const unsigned int CircleBuf::BW_HZ=10;
+  
 // CircleBuf::CircleBuf - Circular input buffer                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -65,6 +71,8 @@ CircleBuf::CircleBuf(unsigned long Size) : Size(Size), Hash(0)
 {
    Buf = new unsigned char[Size];
    Reset();
+
+   CircleBuf::BwReadLimit = _config->FindI("Acquire::http::DlLimit",0)*1024;
 }
                                                                        /*}}}*/
 // CircleBuf::Reset - Reset to the default state                       /*{{{*/
@@ -90,16 +98,45 @@ void CircleBuf::Reset()
    is non-blocking.. */
 bool CircleBuf::Read(int Fd)
 {
+   unsigned long BwReadMax;
+
    while (1)
    {
       // Woops, buffer is full
       if (InP - OutP == Size)
         return true;
-      
+
+      // what's left to read in this tick
+      BwReadMax = CircleBuf::BwReadLimit/BW_HZ;
+
+      if(CircleBuf::BwReadLimit) {
+        struct timeval now;
+        gettimeofday(&now,0);
+
+        unsigned long d = (now.tv_sec-CircleBuf::BwReadTick.tv_sec)*1000000 +
+           now.tv_usec-CircleBuf::BwReadTick.tv_usec;
+        if(d > 1000000/BW_HZ) {
+           CircleBuf::BwReadTick = now;
+           CircleBuf::BwTickReadData = 0;
+        } 
+        
+        if(CircleBuf::BwTickReadData >= BwReadMax) {
+           usleep(1000000/BW_HZ);
+           return true;
+        }
+      }
+
       // Write the buffer segment
       int Res;
-      Res = read(Fd,Buf + (InP%Size),LeftRead());
+      if(CircleBuf::BwReadLimit) {
+        Res = read(Fd,Buf + (InP%Size), 
+                   BwReadMax > LeftRead() ? LeftRead() : BwReadMax);
+      } else
+        Res = read(Fd,Buf + (InP%Size),LeftRead());
       
+      if(Res > 0 && BwReadLimit > 0) 
+        CircleBuf::BwTickReadData += Res;
+    
       if (Res == 0)
         return false;
       if (Res < 0)
index c5a4d0e86a1f9967ed2f573eb9bb508b95646dd4..541e2952cb5fdf540f31129e99ad7e499fc074ef 100644 (file)
@@ -31,6 +31,11 @@ class CircleBuf
    unsigned long MaxGet;
    struct timeval Start;
    
+   static unsigned long BwReadLimit;
+   static unsigned long BwTickReadData;
+   static struct timeval BwReadTick;
+   static const unsigned int BW_HZ;
+
    unsigned long LeftRead()
    {
       unsigned long Sz = Size - (InP - OutP);