diff options
author | Michael Vogt <mvo@debian.org> | 2005-11-30 15:34:28 +0000 |
---|---|---|
committer | Michael Vogt <mvo@debian.org> | 2005-11-30 15:34:28 +0000 |
commit | 39c7baef5ef2fe40b539833714913bd8a85279cd (patch) | |
tree | 5e7a47bab06a48cb9512fb7a3cd9fd2af9fb5fa5 /methods | |
parent | 3174e150a3c97a471998cfe73a11bd4996da9ab7 (diff) | |
parent | b7475c1ea32e60fca03b7092bfe7ee3fd3dfde47 (diff) | |
download | apt-39c7baef5ef2fe40b539833714913bd8a85279cd.tar.gz |
* merged with apt--mvo
Patches applied:
* apt@packages.debian.org/apt--sources-list-d--0--base-0
tag of apt@packages.debian.org/apt--main--0--patch-30
* apt@packages.debian.org/apt--sources-list-d--0--patch-1
Patch from apt-rpm via Michael Vogt to implement /etc/apt/sources.list.d
* bubulle@debian.org--2005/apt--main--0--patch-130
Galician translation completed
* bubulle@debian.org--2005/apt--main--0--patch-131
Simplified Chinese translation update
* bubulle@debian.org--2005/apt--main--0--patch-132
Completed Simplified Chinese translation
* bubulle@debian.org--2005/apt--main--0--patch-133
Merge with Michael AND update PO files
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-90
* merged the sources.list.d patch
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-91
* merged with bubulle
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-92
* changelog update
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-93
* sources.list.d documented
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-94
* pkgDirStream has (slightly) better extract support now
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-95
* merge fix for #339533
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-96
* merged with bubulle
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-97
* some more debug output
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-98
* ABI change: merged more flexible pkgAcquireFile code
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-99
* merged http download limit for apt (#146877)
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-100
* applied parts of the string speedup patch from debian #319377 (ABI change)
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-101
* fix for #340448
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-102
* finalized this release
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-103
* changelog updates
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-104
* build-depend on libdb4.3 now, fix for kFreeBSD (#317718)
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-105
* fix mailaddress
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-106
* fix a string (thanks to bubulle)
* michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-107
* merged with bubulle
Diffstat (limited to 'methods')
-rw-r--r-- | methods/http.cc | 49 | ||||
-rw-r--r-- | methods/http.h | 5 |
2 files changed, 50 insertions, 4 deletions
diff --git a/methods/http.cc b/methods/http.cc index dbf2d1b43..cb63ada49 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -58,7 +58,11 @@ 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 /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -66,6 +70,8 @@ CircleBuf::CircleBuf(unsigned long Size) : Size(Size), Hash(0) { Buf = new unsigned char[Size]; Reset(); + + CircleBuf::BwReadLimit = _config->FindI("Acquire::http::Dl-Limit",0)*1024; } /*}}}*/ // CircleBuf::Reset - Reset to the default state /*{{{*/ @@ -91,16 +97,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) @@ -783,7 +818,10 @@ bool HttpMethod::Flush(ServerState *Srv) { if (File != 0) { - SetNonBlock(File->Fd(),false); + // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking + // can't be set + if (File->Name() != "/dev/null") + SetNonBlock(File->Fd(),false); if (Srv->In.WriteSpace() == false) return true; @@ -811,7 +849,10 @@ bool HttpMethod::ServerDie(ServerState *Srv) // Dump the buffer to the file if (Srv->State == ServerState::Data) { - SetNonBlock(File->Fd(),false); + // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking + // can't be set + if (File->Name() != "/dev/null") + SetNonBlock(File->Fd(),false); while (Srv->In.WriteSpace() == true) { if (Srv->In.Write(File->Fd()) == false) 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); |