📄 startstoprulesdefaultplugin.java
字号:
};
TableManager tm = pi.getUIManager().getTableManager();
TableContextMenuItem menu;
menu = tm.addContextMenuItem(
TableManager.TABLE_MYTORRENTS_COMPLETE, DEBUG_MENU_ID);
menu.addListener(menuListener);
menu = tm.addContextMenuItem(
TableManager.TABLE_MYTORRENTS_INCOMPLETE, DEBUG_MENU_ID);
menu.addListener(menuListener);
}
} catch (Throwable t) {
Debug.printStackTrace(t);
}
}
} finally {
this_mon.exit();
}
}
private int calcMaxSeeders(int iDLs) {
// XXX put in subtraction logic here
int maxActive = getMaxActive();
if (maxActive == 0) {
return 999999;
}
return maxActive - iDLs;
}
protected int getMaxActive() {
if (!_maxActiveWhenSeedingEnabled)
return (_maxActive);
if (download_manager.isSeedingOnly()) {
if (_maxActiveWhenSeeding <= _maxActive)
return (_maxActiveWhenSeeding);
// danger here if we are in a position where allowing more to start when seeding
// allows a non-seeding download to start (looping occurs)
Download[] downloads = download_manager.getDownloads();
boolean danger = false;
for (int i = 0; i < downloads.length && !danger; i++) {
Download download = downloads[i];
int state = download.getState();
if (state == Download.ST_DOWNLOADING || state == Download.ST_SEEDING
|| state == Download.ST_STOPPED || state == Download.ST_STOPPING
|| state == Download.ST_ERROR) {
// not interesting, they can't potentially cause trouble
} else {
// look for incomplete files
DiskManagerFileInfo[] files = download.getDiskManagerFileInfo();
for (int j = 0; j < files.length; j++) {
DiskManagerFileInfo file = files[j];
if ((!file.isSkipped()) && file.getDownloaded() != file.getLength()) {
danger = true;
break;
}
}
}
}
if (!danger)
return (_maxActiveWhenSeeding);
}
return (_maxActive);
}
private class TotalsStats
{
// total Forced Seeding doesn't include stalled torrents
int forcedSeeding = 0;
int forcedSeedingNonFP = 0;
int waitingToSeed = 0;
int waitingToDL = 0;
int downloading = 0;
int activelyDLing = 0;
int activelyCDing = 0;
int complete = 0;
int incompleteQueued = 0;
int firstPriority = 0;
int stalledSeeders = 0;
int stalledFPSeeders = 0;
int forcedActive = 0;
/**
* Indicate whether it's ok to start seeding.
* <p>
* Seeding can start right away when there's no auto-ranking or we are on
* timed ranking. Otherwise, we wait until one of the following happens:
* <ul>
* <li>Any non-stopped/errored torrent gets a scrape result AND it's after
* {@link #MIN_SEEDING_STARTUP_WAIT}
* <li>All scrape results come in for completed, non-stopped/errored torrent
* <li>Any completed non-stopped/errored torrent is FP
* <li>Any torrent has 0 seeds (which, in most cases means it's the highest
* rank)
* </ul>
* <p>
* If none of the above happen, then after {@link #MIN_FIRST_SCRAPE_WAIT},
* the flag will turned on.
*/
// not a total :)
boolean bOkToStartSeeding;
int maxSeeders;
int maxActive;
int maxTorrents;
/**
* Default Constructor
*
* @param dlDataArray list of download data (rank calculators) objects
* to base calculations on.
*/
public TotalsStats(DefaultRankCalculator[] dlDataArray) {
bOkToStartSeeding = (iRankType == RANK_NONE) || (iRankType == RANK_TIMED)
|| (SystemTime.getCurrentTime() - startedOn > MIN_FIRST_SCRAPE_WAIT);
// count the # of ok scrapes when !bOkToStartSeeding, and flip to true
// if all scrapes for non-stopped/errored completes are okay.
int totalOKScrapes = 0;
// - Build a SeedingRank list for sorting
// - Build Count Totals
// - Do anything that doesn't need to be done in Queued order
for (int i = 0; i < dlDataArray.length; i++) {
DefaultRankCalculator dlData = dlDataArray[i];
if (dlData == null) {
continue;
}
Download download = dlData.getDownloadObject();
int state = download.getState();
// No stats colllected on error or stopped torrents
if (state == Download.ST_ERROR || state == Download.ST_STOPPED) {
continue;
}
boolean completed = download.isComplete();
boolean bIsFirstP = false;
// Count forced seedings as using a slot
// Don't count forced downloading as using a slot
if (!completed && download.isForceStart())
continue;
if (completed) {
// Only used when !bOkToStartSeeding.. set only to make compiler happy
boolean bScrapeOk = true;
if (!bOkToStartSeeding) {
bScrapeOk = scrapeResultOk(download);
if (calcSeedsNoUs(download) == 0 && bScrapeOk)
bOkToStartSeeding = true;
else if ((download.getSeedingRank() > 0)
&& (state == Download.ST_QUEUED || state == Download.ST_READY)
&& (SystemTime.getCurrentTime() - startedOn > MIN_SEEDING_STARTUP_WAIT))
bOkToStartSeeding = true;
}
complete++;
if (!bOkToStartSeeding && bScrapeOk)
totalOKScrapes++;
if (dlData.isFirstPriority()) {
if (!bOkToStartSeeding)
bOkToStartSeeding = true;
firstPriority++;
bIsFirstP = true;
}
if (dlData.getActivelySeeding()) {
if (dlData.isForceActive()) {
forcedActive++;
}
activelyCDing++;
if (download.isForceStart()) {
forcedSeeding++;
if (!bIsFirstP)
forcedSeedingNonFP++;
}
} else if (state == Download.ST_SEEDING) {
if (bIsFirstP) {
stalledFPSeeders++;
}
stalledSeeders++;
}
if (state == Download.ST_READY || state == Download.ST_WAITING
|| state == Download.ST_PREPARING) {
waitingToSeed++;
}
} else { // !completed
if (state == Download.ST_DOWNLOADING) {
downloading++;
if (dlData.getActivelyDownloading())
activelyDLing++;
}
if (state == Download.ST_READY || state == Download.ST_WAITING
|| state == Download.ST_PREPARING) {
waitingToDL++;
} else if (state == Download.ST_QUEUED) {
incompleteQueued++;
} //if state
} // if completionLevel
} // for
if (!bOkToStartSeeding && totalOKScrapes == complete)
bOkToStartSeeding = true;
maxSeeders = calcMaxSeeders(activelyDLing + waitingToDL);
maxActive = getMaxActive();
if (maxActive == 0) {
maxTorrents = 9999;
} else if (iMaxUploadSpeed == 0) {
maxTorrents = maxActive + 4;
} else {
// Don't allow more "seeding/downloading" torrents than there is enough
// bandwidth for. There needs to be enough bandwidth for at least
// each torrent to get to its minSpeedForActiveSeeding
// (we buffer it at 2x just to be safe).
int minSpeedPerActive = (minSpeedForActiveSeeding * 2) / 1024;
// Even more buffering/limiting. Limit to enough bandwidth for
// each torrent to have potentially 3kbps.
if (minSpeedPerActive < 3)
minSpeedPerActive = 3;
maxTorrents = (iMaxUploadSpeed / minSpeedPerActive);
// Allow user to do stupid things like have more slots than their
// upload speed can handle
if (maxTorrents < maxActive)
maxTorrents = maxActive;
//System.out.println("maxTorrents = " + maxTorrents + " = " + iMaxUploadSpeed + " / " + minSpeedPerActive);
//System.out.println("totalTorrents = " + (activeSeedingCount + totalStalledSeeders + totalDownloading));
}
} // constructor
}
/**
* Running totals and stuff that gets used during a process run.
* Split into class so complete/incomplete can be seperated into functions
*/
public class ProcessVars
{
int numWaitingOrSeeding; // Running Count
int numWaitingOrDLing; // Running Count
/**
* store whether there's a torrent higher in the list that is queued
* We don't want to start a torrent lower in the list if there's a higherQueued
*/
boolean higherCDtoStart;
boolean higherDLtoStart;
/**
* Tracks the position we should be at in the Completed torrents list
* Updates position.
*/
int posComplete;
boolean bStopAndQueued;
}
private long processCount = 0;
private long processTotalMS = 0;
private long processMaxMS = 0;
private long processLastComplete = 0;
private long processTotalGap = 0;
private long processTotalRecalcs = 0;
private long processTotalZeroRecalcs = 0;
protected void process() {
long now = 0;
try {
this_mon.enter();
now = SystemTime.getCurrentTime();
somethingChanged = false;
Object[] recalcArray = ranksToRecalc.toArray();
ranksToRecalc.clear();
for (int i = 0; i < recalcArray.length; i++) {
DefaultRankCalculator rankObj = (DefaultRankCalculator) recalcArray[i];
if (bDebugLog) {
long oldSR = rankObj.dl.getSeedingRank();
rankObj.recalcSeedingRank();
String s = "recalc seeding rank. old/new=" + oldSR + "/"
+ rankObj.dl.getSeedingRank();
log.log(rankObj.dl.getTorrent(), LoggerChannel.LT_INFORMATION, s);
} else {
rankObj.recalcSeedingRank();
}
}
processTotalRecalcs += recalcArray.length;
if (recalcArray.length == 0) {
processTotalZeroRecalcs++;
}
// pull the data into a local array, so we don't have to lock/synchronize
DefaultRankCalculator[] dlDataArray;
dlDataArray = (DefaultRankCalculator[]) downloadDataMap.values().toArray(
new DefaultRankCalculator[downloadDataMap.size()]);
TotalsStats totals = new TotalsStats(dlDataArray);
String[] mainDebugEntries = null;
if (bDebugLog) {
log.log(LoggerChannel.LT_INFORMATION, ">>process()");
mainDebugEntries = new String[] {
"ok2Start=" + boolDebug(totals.bOkToStartSeeding),
"tFrcdCding=" + totals.forcedSeeding,
"actvCDs=" + totals.activelyCDing,
"tW8tingToCd=" + totals.waitingToSeed,
"tDLing=" + totals.downloading,
"actvDLs=" + totals.activelyDLing,
"tW8tingToDL=" + totals.waitingToDL,
"tCom=" + totals.complete,
"tIncQd=" + totals.incompleteQueued,
"mxCdrs=" + totals.maxSeeders,
"tFP=" + totals.firstPriority,
"maxT=" + totals.maxTorrents
};
}
// Sort
Arrays.sort(dlDataArray);
ProcessVars vars = new ProcessVars();
// pre-included Forced Start torrents so a torrent "above" it doesn't
// start (since normally it would start and assume the torrent below it
// would stop)
vars.numWaitingOrSeeding = totals.forcedSeeding; // Running Count
vars.numWaitingOrDLing = 0; // Running Count
vars.higherCDtoStart = false;
vars.higherDLtoStart = false;
vars.posComplete = 0;
// Loop 2 of 2:
// - Start/Stop torrents based on criteria
for (int i = 0; i < dlDataArray.length; i++) {
DefaultRankCalculator dlData = dlDataArray[i];
Download download = dlData.getDownloadObject();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -