📄 rdresumehandler.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: RDResumeHandler.java
package org.gudy.azureus2.core3.disk.impl.resume;
import com.aelitis.azureus.core.diskmanager.cache.CacheFile;
import com.aelitis.azureus.core.diskmanager.cache.CacheFileManagerException;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.disk.*;
import org.gudy.azureus2.core3.disk.impl.*;
import org.gudy.azureus2.core3.disk.impl.access.DMChecker;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceList;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMapEntry;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.util.AESemaphore;
import org.gudy.azureus2.core3.util.Debug;
public class RDResumeHandler
{
private static final LogIDs LOGID;
private static final byte PIECE_NOT_DONE = 0;
private static final byte PIECE_DONE = 1;
private static final byte PIECE_RECHECK_REQUIRED = 2;
private static final byte PIECE_STARTED = 3;
private static boolean use_fast_resume;
private static boolean use_fast_resume_recheck_all;
private DiskManagerImpl disk_manager;
private DMChecker checker;
private volatile boolean started;
private volatile boolean stopped;
private volatile boolean stopped_for_close;
private volatile boolean check_in_progress;
private volatile boolean check_resume_was_valid;
private volatile boolean check_is_full_check;
private volatile boolean check_interrupted;
private volatile int check_position;
public RDResumeHandler(DiskManagerImpl _disk_manager, DMChecker _writer_and_checker)
{
disk_manager = _disk_manager;
checker = _writer_and_checker;
}
public void start()
{
if (started)
Debug.out("RDResumeHandler: reuse not supported");
started = true;
}
public void stop(boolean closing)
{
stopped_for_close = stopped_for_close | closing;
if (check_in_progress)
check_interrupted = true;
stopped = true;
}
public void checkAllPieces(boolean newfiles)
{
DiskManagerRecheckInstance recheck_inst;
final AESemaphore run_sem;
recheck_inst = disk_manager.getRecheckScheduler().register(disk_manager, false);
run_sem = new AESemaphore("RDResumeHandler::checkAllPieces:runsem", 2);
boolean resume_data_complete = false;
check_in_progress = true;
boolean resumeEnabled = use_fast_resume;
if (newfiles)
resumeEnabled = false;
final AESemaphore pending_checks_sem = new AESemaphore("RD:PendingChecks");
int pending_check_num = 0;
DiskManagerPiece pieces[] = disk_manager.getPieces();
DiskManagerFileInfo files[] = disk_manager.getFiles();
Map file_sizes = new HashMap();
for (int i = 0; i < files.length; i++)
try
{
Long len = new Long(((DiskManagerFileInfoImpl)files[i]).getCacheFile().getLength());
file_sizes.put(files[i], len);
}
catch (CacheFileManagerException e)
{
Debug.printStackTrace(e);
}
if (resumeEnabled)
{
boolean resumeValid = false;
byte resume_pieces[] = null;
Map partialPieces = null;
Map resume_data = getResumeData();
if (resume_data != null)
try
{
resume_pieces = (byte[])(byte[])resume_data.get("resume data");
if (resume_pieces != null && resume_pieces.length != pieces.length)
{
Debug.out((new StringBuilder()).append("Resume data array length mismatch: ").append(resume_pieces.length).append("/").append(pieces.length).toString());
resume_pieces = null;
}
partialPieces = (Map)resume_data.get("blocks");
resumeValid = ((Long)resume_data.get("valid")).intValue() == 1;
if (isTorrentResumeDataComplete(disk_manager.getDownloadManager().getDownloadState(), resume_data))
{
resume_data_complete = true;
} else
{
resume_data.put("valid", new Long(0L));
saveResumeData(resume_data);
}
}
catch (Exception ignore) { }
if (resume_pieces == null)
{
check_is_full_check = true;
resumeValid = false;
resume_pieces = new byte[pieces.length];
Arrays.fill(resume_pieces, (byte)2);
}
check_resume_was_valid = resumeValid;
boolean recheck_all = use_fast_resume_recheck_all;
if (!recheck_all)
{
long total_not_done = 0L;
int piece_size = disk_manager.getPieceLength();
for (int i = 0; i < pieces.length; i++)
if (resume_pieces[i] != 1)
total_not_done += piece_size;
if (total_not_done < 0x4000000L)
recheck_all = true;
}
if (Logger.isEnabled())
{
int total_not_done = 0;
int total_done = 0;
int total_started = 0;
int total_recheck = 0;
for (int i = 0; i < pieces.length; i++)
{
byte piece_state = resume_pieces[i];
if (piece_state == 0)
{
total_not_done++;
continue;
}
if (piece_state == 1)
{
total_done++;
continue;
}
if (piece_state == 3)
total_started++;
else
total_recheck++;
}
String str = (new StringBuilder()).append("valid=").append(resumeValid).append(",not done=").append(total_not_done).append(",done=").append(total_done).append(",started=").append(total_started).append(",recheck=").append(total_recheck).append(",rc all=").append(recheck_all).append(",full=").append(check_is_full_check).toString();
Logger.log(new LogEvent(disk_manager, LOGID, str));
}
for (int i = 0; i < pieces.length; i++)
{
check_position = i;
DiskManagerPiece dm_piece = pieces[i];
disk_manager.setPercentDone(((i + 1) * 1000) / disk_manager.getNbPieces());
boolean pieceCannotExist = false;
byte piece_state = resume_pieces[i];
if (piece_state == 1 || !resumeValid || recheck_all)
{
DMPieceList list = disk_manager.getPieceList(i);
int j = 0;
do
{
if (j >= list.size())
break;
DMPieceMapEntry entry = list.get(j);
Long file_size = (Long)file_sizes.get(entry.getFile());
if (file_size == null)
{
piece_state = 0;
pieceCannotExist = true;
if (Logger.isEnabled())
Logger.log(new LogEvent(disk_manager, LOGID, 1, (new StringBuilder()).append("Piece #").append(i).append(": file is missing, ").append("fails re-check.").toString()));
break;
}
long expected_size = entry.getOffset() + (long)entry.getLength();
if (file_size.longValue() < expected_size)
{
piece_state = 0;
pieceCannotExist = true;
if (Logger.isEnabled())
Logger.log(new LogEvent(disk_manager, LOGID, 1, (new StringBuilder()).append("Piece #").append(i).append(": file is too small, fails re-check. File size = ").append(file_size).append(", piece needs ").append(expected_size).toString()));
break;
}
j++;
} while (true);
}
if (piece_state == 1)
{
dm_piece.setDone(true);
continue;
}
if (piece_state == 0 && !recheck_all)
continue;
if (pieceCannotExist)
{
dm_piece.setDone(false);
continue;
}
if (piece_state != 2 && resumeValid)
continue;
run_sem.reserve();
while (!stopped && !recheck_inst.getPermission()) ;
if (stopped)
break;
try
{
DiskManagerCheckRequest request = disk_manager.createCheckRequest(i, null);
request.setLowPriority(true);
checker.enqueueCheckRequest(request, new DiskManagerCheckRequestListener() {
final AESemaphore val$run_sem;
final AESemaphore val$pending_checks_sem;
final RDResumeHandler this$0;
public void checkCompleted(DiskManagerCheckRequest request, boolean passed)
{
complete();
}
public void checkCancelled(DiskManagerCheckRequest request)
{
complete();
}
public void checkFailed(DiskManagerCheckRequest request, Throwable cause)
{
complete();
}
protected void complete()
{
run_sem.release();
pending_checks_sem.release();
}
{
this$0 = RDResumeHandler.this;
run_sem = aesemaphore;
pending_checks_sem = aesemaphore1;
super();
}
});
pending_check_num++;
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
for (; pending_check_num > 0; pending_check_num--)
pending_checks_sem.reserve();
if (partialPieces != null)
{
Iterator iter = partialPieces.entrySet().iterator();
do
{
if (!iter.hasNext())
break;
java.util.Map.Entry key = (java.util.Map.Entry)iter.next();
int pieceNumber = Integer.parseInt((String)key.getKey());
DiskManagerPiece dm_piece = pieces[pieceNumber];
if (!dm_piece.isDone())
{
List blocks = (List)partialPieces.get(key.getKey());
Iterator iterBlock = blocks.iterator();
while (iterBlock.hasNext())
dm_piece.setWritten(((Long)iterBlock.next()).intValue());
}
} while (true);
}
} else
{
for (int i = 0; i < pieces.length; i++)
{
check_position = i;
disk_manager.setPercentDone(((i + 1) * 1000) / disk_manager.getNbPieces());
boolean pieceCannotExist = false;
DMPieceList list = disk_manager.getPieceList(i);
int j = 0;
do
{
if (j >= list.size())
break;
DMPieceMapEntry entry = list.get(j);
Long file_size = (Long)file_sizes.get(entry.getFile());
if (file_size == null)
{
pieceCannotExist = true;
break;
}
long expected_size = entry.getOffset() + (long)entry.getLength();
if (file_size.longValue() < expected_size)
{
pieceCannotExist = true;
break;
}
j++;
} while (true);
if (pieceCannotExist)
{
disk_manager.getPiece(i).setDone(false);
continue;
}
run_sem.reserve();
while (!stopped && !recheck_inst.getPermission()) ;
if (stopped)
break;
try
{
DiskManagerCheckRequest request = disk_manager.createCheckRequest(i, null);
request.setLowPriority(true);
checker.enqueueCheckRequest(request, new DiskManagerCheckRequestListener() {
final AESemaphore val$run_sem;
final AESemaphore val$pending_checks_sem;
final RDResumeHandler this$0;
public void checkCompleted(DiskManagerCheckRequest request, boolean passed)
{
complete();
}
public void checkCancelled(DiskManagerCheckRequest request)
{
complete();
}
public void checkFailed(DiskManagerCheckRequest request, Throwable cause)
{
complete();
}
protected void complete()
{
run_sem.release();
pending_checks_sem.release();
}
{
this$0 = RDResumeHandler.this;
run_sem = aesemaphore;
pending_checks_sem = aesemaphore1;
super();
}
});
pending_check_num++;
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
for (; pending_check_num > 0; pending_check_num--)
pending_checks_sem.reserve();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -