📄 speedmanagerimpl.java
字号:
int ping_average = ping_total/ping_count;
int running_average = (int)ping_average_history.update( ping_average );
if ( ping_average > max_ping ){
max_ping = ping_average;
}
int up_average = (int)upload_average.getAverage();
// if we're uploading slowly or the current ping rate is better than our current idle average
// then we count this towards establishing the baseline
if ( up_average <= IDLE_UPLOAD_SPEED || ( running_average < idle_average && !idle_average_set )){
idle_ticks++;
if ( idle_ticks >= PING_AVERAGE_HISTORY_COUNT ){
idle_average = Math.max( running_average, MIN_IDLE_AVERAGE );
log( "New idle average: " + idle_average );
idle_average_set = true;
}
}else{
if ( up_average > max_upload_average ){
max_upload_average = up_average;
log( "New max upload:" + max_upload_average );
}
idle_ticks = 0;
}
if ( idle_average_set && running_average < idle_average ){
// bump down if we happen to come across lower idle values
idle_average = Math.max( running_average, MIN_IDLE_AVERAGE );
}
int current_speed = adapter.getCurrentDataUploadSpeed() + adapter.getCurrentProtocolUploadSpeed();
int current_limit = adapter.getCurrentUploadLimit();
int new_limit = current_limit;
log(
"Pings: " + str + ", average=" + ping_average +", running_average=" + running_average +
",idle_average=" + idle_average + ", speed=" + current_speed + ",limit=" + current_limit +
",choke = " + (int)choke_speed_average.getAverage());
if ( mode == MODE_FORCED_MAX ){
if ( mode_ticks > FORCED_MAX_TICKS ){
mode = MODE_RUNNING;
current_limit = new_limit = saved_limit;
}
}else if ( mode == MODE_FORCED_MIN ){
if ( idle_average_set || mode_ticks > FORCED_MIN_TICKS ){
log( "Mode -> running" );
if ( !idle_average_set ){
idle_average = Math.max( running_average, MIN_IDLE_AVERAGE );
idle_average_set = true;
}
mode = MODE_RUNNING;
mode_ticks = 0;
current_limit = new_limit = saved_limit;
}else if ( mode_ticks == 5 ){
// we've had 5 secs of min up speed, clear out the ping average now
// to get accurate times
ping_average_history.reset();
}
}
if ( mode == MODE_RUNNING ){
if ( ( ticks > FORCED_MIN_AT_START_TICK_LIMIT && !idle_average_set ) ||
( replacement_contacts >= 2 && idle_average_set )){
// we've been running a while but no min set, or we've got some new untested
// contacts - force it
log( "Mode -> forced min" );
mode = MODE_FORCED_MIN;
mode_ticks = 0;
saved_limit = current_limit;
idle_average_set = false;
idle_ticks = 0;
replacement_contacts= 0;
new_limit = FORCED_MIN_SPEED;
}else{
int short_up = (int)upload_short_average.getAverage();
int choke_speed = (int)choke_speed_average.getAverage();
if ( running_average < 2* idle_average && ping_average < PING_CHOKE_TIME ){
direction = INCREASING;
int diff = running_average - idle_average;
if ( diff < 100 ){
diff = 100;
}
int increment = 1024 * ( diff / LATENCY_FACTOR );
// if we're close to the last choke-speed then decrease increments
int max_inc = MAX_INCREMENT;
if ( new_limit + 2*1024 > choke_speed ){
max_inc = 1024;
}else if ( new_limit + 5*1024 > choke_speed ){
max_inc += 3*1024;
}
new_limit += Math.min( increment, max_inc );
}else if ( ping_average > 4*idle_average || ping_average > PING_CHOKE_TIME ){
if ( direction == INCREASING ){
if ( idle_average_set ){
choke_speed_average.update( short_up );
}
}
direction = DECREASING;
int decrement = 1024 * (( ping_average - (3*idle_average )) / LATENCY_FACTOR );
new_limit -= Math.min( decrement, MAX_DECREMENT );
// don't drop below the current protocol upload speed. This is to address
// the situation whereby it is downloading that is choking the line - killing
// protocol upspeed kills the downspeed
if ( new_limit < upload_short_prot_average.getAverage() + 1024 ){
new_limit = (int)upload_short_prot_average.getAverage() + 1024;
}
}
if ( new_limit < 1024 ){
new_limit = 1024;
}
}
// final tidy up
if ( MIN_UP > 0 && new_limit < MIN_UP && mode != MODE_FORCED_MIN ){
new_limit = MIN_UP;
}else if ( MAX_UP > 0 && new_limit > MAX_UP && mode != MODE_FORCED_MAX ){
new_limit = MAX_UP;
}
// if we're not achieving the current limit and the advice is to increase it, don't
// bother
if ( new_limit > current_limit && current_speed < ( current_limit - 10*1024 )){
new_limit = current_limit;
}
}
if ( enabled ){
// round limit up to nearest K
new_limit = (( new_limit + 1023 )/1024) * 1024;
adapter.setCurrentUploadLimit( new_limit );
if ( ADJUST_DOWNLOAD_ENABLE && !( Float.isInfinite( ADJUST_DOWNLOAD_RATIO ) || Float.isNaN( ADJUST_DOWNLOAD_RATIO ))){
int dl_limit = (int)(new_limit * ADJUST_DOWNLOAD_RATIO);
adapter.setCurrentDownloadLimit( dl_limit );
}
}
}
public boolean
isAvailable()
{
return( speed_tester != null );
}
public void
setMinumumUploadSpeed(
int speed )
{
COConfigurationManager.setParameter( CONFIG_MIN_UP, speed );
}
public int
getMinumumUploadSpeed()
{
return( MIN_UP );
}
public void
setMaximumUploadSpeed(
int speed )
{
COConfigurationManager.setParameter( CONFIG_MAX_UP, speed );
}
public int
getMaximumUploadSpeed()
{
return( MAX_UP );
}
public int
getChokePingTime()
{
return( PING_CHOKE_TIME );
}
public void
setChokePingTime(
int milliseconds )
{
COConfigurationManager.setParameter( CONFIG_CHOKE_PING, milliseconds );
}
public void
setEnabled(
boolean _enabled )
{
if ( enabled != _enabled ){
if ( _enabled ){
original_limits = adapter.getLimits();
}
reset();
enabled = _enabled;
if ( speed_tester != null ){
speed_tester.setContactNumber( enabled?CONTACT_NUMBER:0);
}
if ( !enabled ){
adapter.setLimits( original_limits, true, ADJUST_DOWNLOAD_ENABLE );
}
}
}
public boolean
isEnabled()
{
return( enabled );
}
public DHTSpeedTester
getSpeedTester()
{
return( speed_tester );
}
public SpeedManagerPingSource[]
getPingSources()
{
return( contacts_array );
}
public int
getIdlePingMillis()
{
return( idle_average );
}
public int
getCurrentPingMillis()
{
return( (int)ping_average_history.getAverage());
}
public int
getMaxPingMillis()
{
return( max_ping );
}
/**
* Returns the current view of when choking occurs
* @return speed in bytes/sec
*/
public int
getCurrentChokeSpeed()
{
return((int)choke_speed_average.getAverage());
}
public int
getMaxUploadSpeed()
{
return( max_upload_average );
}
protected void
log(
String str )
{
if ( DEBUG ){
System.out.println( str );
}
}
protected class
pingContact
implements SpeedManagerPingSource
{
private DHTSpeedTesterContact contact;
private int bad_pings;
private int last_good_ping;
protected
pingContact(
DHTSpeedTesterContact _contact )
{
contact = _contact;
}
void
pingReceived(
int time,
boolean good_ping )
{
if ( good_ping ){
bad_pings = 0;
last_good_ping = time;
}else{
bad_pings++;
}
// three strikes and you're out!
if ( bad_pings == 3 ){
contact.destroy();
}
}
public InetSocketAddress
getAddress()
{
return( contact.getContact().getAddress());
}
public int
getPingTime()
{
return( last_good_ping );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -