Skip to content

Commit 9d2ccbf

Browse files
committed
Further allocation fixes
1 parent 7536d4e commit 9d2ccbf

File tree

4 files changed

+151
-109
lines changed

4 files changed

+151
-109
lines changed

core/src/com/biglybt/core/download/DownloadManager.java

+12
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,18 @@
245245

246246
public void
247247
resume();
248+
249+
/**
250+
* resume the download and wait until it reaches the target state. It may fail to reach this
251+
* state (e.g. goes into an error state). It will however block if it looks like progress towards
252+
* the state is being made (allocating/checking)
253+
* @param target_state
254+
* @return whether or not the state was reached
255+
*/
256+
257+
public boolean
258+
resume(
259+
int target_state );
248260

249261
public int
250262
getTCPListeningPortNumber();

core/src/com/biglybt/core/download/impl/DownloadManagerImpl.java

+82-44
Original file line numberDiff line numberDiff line change
@@ -2926,50 +2926,7 @@ public void perform(TimerEvent event){
29262926

29272927
if ( paused ){
29282928

2929-
resume();
2930-
2931-
long start = SystemTime.getMonotonousTime();
2932-
2933-
long max = 2*1000;
2934-
2935-
// give it some time to get back to where it was
2936-
2937-
while( true ){
2938-
2939-
int current_state = getState();
2940-
2941-
if ( current_state == state_before ){
2942-
2943-
break;
2944-
}
2945-
2946-
if ( SystemTime.getMonotonousTime() - start > max ){
2947-
2948-
break;
2949-
}
2950-
2951-
if ( current_state == DownloadManager.STATE_STOPPED ||
2952-
current_state == DownloadManager.STATE_ERROR ||
2953-
current_state == DownloadManager.STATE_QUEUED ||
2954-
current_state == DownloadManager.STATE_DOWNLOADING ||
2955-
current_state == DownloadManager.STATE_SEEDING ){
2956-
2957-
break;
2958-
}
2959-
2960-
if ( current_state == DownloadManager.STATE_ALLOCATING ||
2961-
current_state == DownloadManager.STATE_CHECKING ){
2962-
2963-
max = 10*1000;
2964-
}
2965-
2966-
try{
2967-
Thread.sleep(100);
2968-
2969-
}catch( Throwable e ){
2970-
2971-
}
2972-
}
2929+
resume( state_before );
29732930
}
29742931
}
29752932
}
@@ -3164,6 +3121,87 @@ public String getStopReason() {
31643121
globalManager.resumeDownload( this );
31653122
}
31663123

3124+
@Override
3125+
public boolean
3126+
resume(
3127+
int target_state)
3128+
{
3129+
resume();
3130+
3131+
if ( target_state != DownloadManager.STATE_DOWNLOADING &&
3132+
target_state != DownloadManager.STATE_SEEDING ){
3133+
3134+
// sanitize target state
3135+
3136+
target_state = DownloadManager.STATE_QUEUED;
3137+
}
3138+
3139+
long quit_at = SystemTime.getMonotonousTime() + 2500;
3140+
3141+
boolean is_queued = false;
3142+
3143+
// give it some time to get back to where it was
3144+
3145+
while( true ){
3146+
3147+
int current_state = getState();
3148+
3149+
if ( current_state == target_state ){
3150+
3151+
return( true );
3152+
}
3153+
3154+
long now = SystemTime.getMonotonousTime();
3155+
3156+
if ( current_state == DownloadManager.STATE_QUEUED ){
3157+
3158+
// queued can be transitionary so give it a chance to transit
3159+
3160+
if ( !is_queued ){
3161+
3162+
is_queued = true;
3163+
3164+
quit_at = now + 5*1000;
3165+
}
3166+
}else{
3167+
3168+
is_queued = false;
3169+
}
3170+
3171+
if ( current_state == DownloadManager.STATE_STOPPED ||
3172+
current_state == DownloadManager.STATE_ERROR ||
3173+
current_state == DownloadManager.STATE_DOWNLOADING ||
3174+
current_state == DownloadManager.STATE_SEEDING ){
3175+
3176+
// not making any allocation progress or completed
3177+
3178+
return( false );
3179+
}
3180+
3181+
if ( current_state == DownloadManager.STATE_ALLOCATING ||
3182+
current_state == DownloadManager.STATE_CHECKING ){
3183+
3184+
// making progress, hang around
3185+
3186+
quit_at = now + 10*1000;
3187+
}
3188+
3189+
if ( now > quit_at ){
3190+
3191+
Debug.out( "Gave up waiting for resume target state to be achieved (current=" + current_state + ",target=" + target_state + ")" );
3192+
3193+
return( false );
3194+
}
3195+
3196+
try{
3197+
Thread.sleep(100);
3198+
3199+
}catch( Throwable e ){
3200+
3201+
}
3202+
}
3203+
}
3204+
31673205
@Override
31683206
public boolean getAssumedComplete() {
31693207
return assumedComplete;

uis/src/com/biglybt/ui/swt/views/FilesViewMenuUtil.java

+56-64
Original file line numberDiff line numberDiff line change
@@ -1652,12 +1652,8 @@ public static void changePriority(Object type, final List<DiskManagerFileInfo> f
16521652
dm.setFilePriorities(fileInfos, -1);
16531653
}
16541654

1655-
boolean paused = setSkipped(dm, fileInfos, skipped, delete_action?1:0, prompt );
1655+
setSkipped(dm, fileInfos, skipped, delete_action?1:0, prompt );
16561656

1657-
if (paused) {
1658-
1659-
dm.resume();
1660-
}
16611657
}
16621658
}
16631659

@@ -1684,12 +1680,7 @@ public static void setSkipped( List<DiskManagerFileInfo> file_list, boolean skip
16841680
ArrayList<DiskManagerFileInfo> list = mapDMtoDMFI.get(dm);
16851681
DiskManagerFileInfo[] fileInfos = list.toArray(new DiskManagerFileInfo[0]);
16861682

1687-
boolean paused = setSkipped(dm, fileInfos, skipped, delete_action, prompt );
1688-
1689-
if (paused) {
1690-
1691-
dm.resume();
1692-
}
1683+
setSkipped(dm, fileInfos, skipped, delete_action, prompt );
16931684
}
16941685
}
16951686

@@ -1740,12 +1731,7 @@ public void UIInputReceiverClosed(UIInputReceiver entryWindow) {
17401731
for (DownloadManager dm : mapDMtoDMFI.keySet()) {
17411732
ArrayList<DiskManagerFileInfo> list = mapDMtoDMFI.get(dm);
17421733
DiskManagerFileInfo[] fileInfos = list.toArray(new DiskManagerFileInfo[0]);
1743-
boolean paused = setSkipped(dm, fileInfos, false, 0, true);
1744-
1745-
if (paused) {
1746-
1747-
dm.resume();
1748-
}
1734+
setSkipped(dm, fileInfos, false, 0, true);
17491735
}
17501736
}
17511737
});
@@ -1809,12 +1795,7 @@ public void UIInputReceiverClosed(UIInputReceiver entryWindow) {
18091795
for (DownloadManager dm : mapDMtoDMFI.keySet()) {
18101796
ArrayList<DiskManagerFileInfo> list = mapDMtoDMFI.get(dm);
18111797
DiskManagerFileInfo[] fileInfos = list.toArray(new DiskManagerFileInfo[0]);
1812-
boolean paused = setSkipped(dm, fileInfos, false, 0, true);
1813-
1814-
if (paused) {
1815-
1816-
dm.resume();
1817-
}
1798+
setSkipped(dm, fileInfos, false, 0, true);
18181799
}
18191800
}
18201801

@@ -2366,7 +2347,7 @@ public void prompterClosed(int result) {
23662347
* @param prompt
23672348
* @return
23682349
*/
2369-
private static boolean
2350+
private static void
23702351
setSkipped(
23712352
DownloadManager manager,
23722353
DiskManagerFileInfo[] infos,
@@ -2381,7 +2362,7 @@ public void prompterClosed(int result) {
23812362
for (int i = 0; i < infos.length; i++) {
23822363
infos[i].setSkipped(skipped);
23832364
}
2384-
return false;
2365+
return;
23852366
}
23862367
int[] existing_storage_types = manager.getStorageType(infos);
23872368
int nbFiles = manager.getDiskManagerFileInfoSet().nbFiles();
@@ -2506,50 +2487,61 @@ public void prompterClosed(int result) {
25062487
}
25072488

25082489
boolean ok = true;
2509-
boolean paused = false;
2510-
if (type_has_been_changed) {
2511-
if (requires_pausing)
2512-
paused = manager.pause( true );
2513-
if (linearCount > 0)
2514-
ok &= Arrays.equals(
2515-
setLinear,
2516-
manager.getDiskManagerFileInfoSet().setStorageTypes(setLinear,
2517-
DiskManagerFileInfo.ST_LINEAR));
2518-
if (compactCount > 0)
2519-
ok &= Arrays.equals(
2520-
setCompact,
2521-
manager.getDiskManagerFileInfoSet().setStorageTypes(setCompact,
2522-
DiskManagerFileInfo.ST_COMPACT));
2523-
if (reorderCount > 0)
2524-
ok &= Arrays.equals(
2525-
setReorder,
2526-
manager.getDiskManagerFileInfoSet().setStorageTypes(setReorder,
2527-
DiskManagerFileInfo.ST_REORDER));
2528-
if (reorderCompactCount > 0)
2529-
ok &= Arrays.equals(
2530-
setReorderCompact,
2531-
manager.getDiskManagerFileInfoSet().setStorageTypes(setReorderCompact,
2532-
DiskManagerFileInfo.ST_REORDER_COMPACT));
2533-
}
2534-
2535-
if (ok) {
2536-
boolean[] toChange = new boolean[nbFiles];
2537-
2538-
for (int i = 0; i < infos.length; i++) {
2539-
if ( infos[i].isSkipped() != skipped ){
2540-
toChange[infos[i].getIndex()] = true;
2490+
2491+
boolean paused = false;
2492+
int target_state = 0;
2493+
2494+
try{
2495+
if (type_has_been_changed) {
2496+
if (requires_pausing){
2497+
target_state = manager.getState();
2498+
paused = manager.pause( true );
25412499
}
2500+
if (linearCount > 0)
2501+
ok &= Arrays.equals(
2502+
setLinear,
2503+
manager.getDiskManagerFileInfoSet().setStorageTypes(setLinear,
2504+
DiskManagerFileInfo.ST_LINEAR));
2505+
if (compactCount > 0)
2506+
ok &= Arrays.equals(
2507+
setCompact,
2508+
manager.getDiskManagerFileInfoSet().setStorageTypes(setCompact,
2509+
DiskManagerFileInfo.ST_COMPACT));
2510+
if (reorderCount > 0)
2511+
ok &= Arrays.equals(
2512+
setReorder,
2513+
manager.getDiskManagerFileInfoSet().setStorageTypes(setReorder,
2514+
DiskManagerFileInfo.ST_REORDER));
2515+
if (reorderCompactCount > 0)
2516+
ok &= Arrays.equals(
2517+
setReorderCompact,
2518+
manager.getDiskManagerFileInfoSet().setStorageTypes(setReorderCompact,
2519+
DiskManagerFileInfo.ST_REORDER_COMPACT));
25422520
}
2521+
2522+
if (ok) {
2523+
boolean[] toChange = new boolean[nbFiles];
2524+
2525+
for (int i = 0; i < infos.length; i++) {
2526+
if ( infos[i].isSkipped() != skipped ){
2527+
toChange[infos[i].getIndex()] = true;
2528+
}
2529+
}
2530+
2531+
manager.getDiskManagerFileInfoSet().setSkipped(toChange, skipped );
2532+
/*
2533+
for (int i = 0; i < infos.length; i++) {
2534+
infos[i].setSkipped(skipped);
2535+
}
2536+
*/
2537+
}
2538+
}finally{
25432539

2544-
manager.getDiskManagerFileInfoSet().setSkipped(toChange, skipped );
2545-
/*
2546-
for (int i = 0; i < infos.length; i++) {
2547-
infos[i].setSkipped(skipped);
2540+
if ( paused ){
2541+
2542+
manager.resume( target_state );
25482543
}
2549-
*/
25502544
}
2551-
2552-
return paused;
25532545
}
25542546

25552547
public static void

uis/src/com/biglybt/ui/swt/views/tableitems/files/PathItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ protected static String determinePath(DiskManagerFileInfo fileInfo, boolean _sho
143143
path = file.getParentFile().getAbsolutePath();
144144
}
145145

146-
if ( !path.endsWith( File.separator )){
146+
if ( path != null && !path.endsWith( File.separator )){
147147

148148
path += File.separator;
149149
}

0 commit comments

Comments
 (0)