From 2c38625920fa67d52ade11fd7d28cdb5373dc31c Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 31 Mar 2005 09:07:12 +0000 Subject: [PATCH] * merged the apt--main with the 2004 bwlimit tree 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 | 4 ++-- apt-pkg/acquire.cc | 4 ++++ debian/rules | 2 +- methods/http.cc | 41 +++++++++++++++++++++++++++++++++++++++-- methods/http.h | 5 +++++ 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 72cac61b5..b35ad4a0d 100644 --- 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 diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 70dce4f54..212c8d52b 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -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; } /*}}}*/ diff --git a/debian/rules b/debian/rules index e3254c2d2..fdae46352 100755 --- a/debian/rules +++ b/debian/rules @@ -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') diff --git a/methods/http.cc b/methods/http.cc index 81a64d7a3..27f0dafef 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -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) diff --git a/methods/http.h b/methods/http.h index c5a4d0e86..541e2952c 100644 --- a/methods/http.h +++ b/methods/http.h @@ -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); -- 2.45.2