net.i2p.router.transport
Class FIFOBandwidthLimiter

java.lang.Object
  extended by net.i2p.router.transport.FIFOBandwidthLimiter

public class FIFOBandwidthLimiter
extends java.lang.Object

Concurrent plan: It's difficult to get rid of the locks on _pendingInboundRequests since locked_satisyInboundAvailable() leaves Requests on the head of the queue. When we go to Java 6, we can convert from a locked ArrayList to a LinkedBlockingDeque, where locked_sIA will poll() from the head of the queue, and if the request is not fully satisfied, offerFirst() (i.e. push) it back on the head. Ditto outbound of course. In the meantime, for Java 5, we have lockless 'shortcut' methods for the common case where we are under the bandwidth limits. And the volatile counters are now AtomicIntegers / AtomicLongs.


Nested Class Summary
static interface FIFOBandwidthLimiter.CompleteListener
           
static interface FIFOBandwidthLimiter.Request
          This is somewhat complicated by having both inbound and outbound in a single request.
 
Constructor Summary
FIFOBandwidthLimiter(I2PAppContext context)
           
 
Method Summary
 FIFOBandwidthLimiter.Request createRequest()
           
 int getInboundBurstBytes()
           
 int getInboundBurstKBytesPerSecond()
           
 int getInboundKBytesPerSecond()
           
 boolean getInboundUnlimited()
           
 int getOutboundBurstBytes()
           
 int getOutboundBurstKBytesPerSecond()
           
 int getOutboundKBytesPerSecond()
          These are the configured maximums, not the current rate
 boolean getOutboundUnlimited()
           
 float getReceiveBps()
           
 float getReceiveBps15s()
           
 float getSendBps()
           
 float getSendBps15s()
           
(package private)  java.lang.StringBuilder getStatus()
           
 long getTotalAllocatedInboundBytes()
           
 long getTotalAllocatedOutboundBytes()
           
 long getTotalWastedInboundBytes()
           
 long getTotalWastedOutboundBytes()
           
 long now()
           
(package private)  void refillBandwidthQueues(java.util.List<FIFOBandwidthLimiter.Request> buf, long bytesInbound, long bytesOutbound, long maxBurstIn, long maxBurstOut)
          More bytes are available - add them to the queue and satisfy any requests we can
 void reinitialize()
           
 void renderStatusHTML(java.io.Writer out)
          Deprecated. not worth translating
 FIFOBandwidthLimiter.Request requestInbound(int bytesIn, java.lang.String purpose)
          Request some bytes.
 FIFOBandwidthLimiter.Request requestInbound(int bytesIn, java.lang.String purpose, FIFOBandwidthLimiter.CompleteListener lsnr, java.lang.Object attachment)
           
 FIFOBandwidthLimiter.Request requestOutbound(int bytesOut, java.lang.String purpose)
          Request some bytes.
 FIFOBandwidthLimiter.Request requestOutbound(int bytesOut, java.lang.String purpose, FIFOBandwidthLimiter.CompleteListener lsnr, java.lang.Object attachment)
           
(package private)  void setInboundBurstBytes(int bytes)
           
(package private)  void setInboundBurstKBps(int kbytesPerSecond)
           
 void setInboundUnlimited(boolean isUnlimited)
           
(package private)  void setOutboundBurstBytes(int bytes)
           
(package private)  void setOutboundBurstKBps(int kbytesPerSecond)
           
 void setOutboundUnlimited(boolean isUnlimited)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FIFOBandwidthLimiter

public FIFOBandwidthLimiter(I2PAppContext context)
Method Detail

now

public long now()

getTotalAllocatedInboundBytes

public long getTotalAllocatedInboundBytes()

getTotalAllocatedOutboundBytes

public long getTotalAllocatedOutboundBytes()

getTotalWastedInboundBytes

public long getTotalWastedInboundBytes()

getTotalWastedOutboundBytes

public long getTotalWastedOutboundBytes()

getInboundUnlimited

public boolean getInboundUnlimited()

setInboundUnlimited

public void setInboundUnlimited(boolean isUnlimited)

getOutboundUnlimited

public boolean getOutboundUnlimited()

setOutboundUnlimited

public void setOutboundUnlimited(boolean isUnlimited)

getSendBps

public float getSendBps()

getReceiveBps

public float getReceiveBps()

getSendBps15s

public float getSendBps15s()

getReceiveBps15s

public float getReceiveBps15s()

getOutboundKBytesPerSecond

public int getOutboundKBytesPerSecond()
These are the configured maximums, not the current rate


getInboundKBytesPerSecond

public int getInboundKBytesPerSecond()

getOutboundBurstKBytesPerSecond

public int getOutboundBurstKBytesPerSecond()

getInboundBurstKBytesPerSecond

public int getInboundBurstKBytesPerSecond()

reinitialize

public void reinitialize()

createRequest

public FIFOBandwidthLimiter.Request createRequest()

requestInbound

public FIFOBandwidthLimiter.Request requestInbound(int bytesIn,
                                                   java.lang.String purpose)
Request some bytes. Does not block.


requestInbound

public FIFOBandwidthLimiter.Request requestInbound(int bytesIn,
                                                   java.lang.String purpose,
                                                   FIFOBandwidthLimiter.CompleteListener lsnr,
                                                   java.lang.Object attachment)

requestOutbound

public FIFOBandwidthLimiter.Request requestOutbound(int bytesOut,
                                                    java.lang.String purpose)
Request some bytes. Does not block.


requestOutbound

public FIFOBandwidthLimiter.Request requestOutbound(int bytesOut,
                                                    java.lang.String purpose,
                                                    FIFOBandwidthLimiter.CompleteListener lsnr,
                                                    java.lang.Object attachment)

setInboundBurstKBps

void setInboundBurstKBps(int kbytesPerSecond)

setOutboundBurstKBps

void setOutboundBurstKBps(int kbytesPerSecond)

getInboundBurstBytes

public int getInboundBurstBytes()

getOutboundBurstBytes

public int getOutboundBurstBytes()

setInboundBurstBytes

void setInboundBurstBytes(int bytes)

setOutboundBurstBytes

void setOutboundBurstBytes(int bytes)

getStatus

java.lang.StringBuilder getStatus()

refillBandwidthQueues

final void refillBandwidthQueues(java.util.List<FIFOBandwidthLimiter.Request> buf,
                                 long bytesInbound,
                                 long bytesOutbound,
                                 long maxBurstIn,
                                 long maxBurstOut)
More bytes are available - add them to the queue and satisfy any requests we can

Parameters:
maxBurstIn - allow up to this many bytes in from the burst section for this time period (may be negative)
maxBurstOut - allow up to this many bytes in from the burst section for this time period (may be negative)

renderStatusHTML

public void renderStatusHTML(java.io.Writer out)
                      throws java.io.IOException
Deprecated. not worth translating

Throws:
java.io.IOException