mirror of
https://github.com/mirror/wget.git
synced 2025-03-14 20:00:15 +08:00
Transfer struct range array to multi.c. Delete to redundant variables in retr.c.
This commit is contained in:
parent
f51826d9d8
commit
c25d01feb7
45
src/multi.c
45
src/multi.c
@ -10,6 +10,50 @@
|
||||
#include "multi.h"
|
||||
#include "url.h"
|
||||
|
||||
static struct range *ranges;
|
||||
|
||||
void
|
||||
init_ranges(int numthreads)
|
||||
{
|
||||
ranges = malloc (numthreads * (sizeof *ranges));
|
||||
}
|
||||
|
||||
int
|
||||
fill_ranges_data(int numthreads, int num_of_resources, long long int file_size,
|
||||
long int chunk_size)
|
||||
{
|
||||
int i, r;
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
ranges[i].first_byte = i * chunk_size;
|
||||
ranges[i].last_byte = (i+1) * chunk_size - 1;
|
||||
ranges[i].bytes_covered = ranges[i].is_assigned = 0;
|
||||
ranges[i].resources = malloc(num_of_resources * sizeof(bool));
|
||||
ranges[i].status_least_severe = RETROK;
|
||||
for (r = 0; r < num_of_resources; ++r)
|
||||
ranges[i].resources[r] = false;
|
||||
++i;
|
||||
} while (ranges[i-1].last_byte < (file_size - 1));
|
||||
ranges[i-1].last_byte = file_size -1;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
void
|
||||
clean_range_res_data(int num_of_resources)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < num_of_resources; ++i)
|
||||
free (ranges[i].resources);
|
||||
}
|
||||
|
||||
void
|
||||
clean_ranges()
|
||||
{
|
||||
free (ranges);
|
||||
}
|
||||
|
||||
int
|
||||
spawn_thread (struct s_thread_ctx *thread_ctx, int index, int resource)
|
||||
{
|
||||
@ -20,6 +64,7 @@ spawn_thread (struct s_thread_ctx *thread_ctx, int index, int resource)
|
||||
if(!thread_ctx[index].url_parsed)
|
||||
return 1;
|
||||
|
||||
thread_ctx[index].range = ranges + index;
|
||||
(thread_ctx[index].range)->is_assigned = 1;
|
||||
(thread_ctx[index].range)->resources[resource] = true;
|
||||
thread_ctx[index].used = 1;
|
||||
|
@ -56,6 +56,14 @@ struct s_thread_ctx
|
||||
uerr_t status;
|
||||
};
|
||||
|
||||
void init_ranges(int);
|
||||
|
||||
int fill_ranges_data(int, int, long long int, long int);
|
||||
|
||||
void clean_range_res_data(int);
|
||||
|
||||
void clean_ranges();
|
||||
|
||||
int spawn_thread (struct s_thread_ctx*, int, int);
|
||||
|
||||
int collect_thread (sem_t *, struct s_thread_ctx *, int);
|
||||
|
45
src/retr.c
45
src/retr.c
@ -1069,7 +1069,6 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
{
|
||||
/*GSoC wget*/
|
||||
char *temp, **files;
|
||||
FILE *file1, *file2;
|
||||
int i, j, r, index, dt, url_err, retries;
|
||||
int ret, N_THREADS = opt.jobs > 0 ? opt.jobs : 1;
|
||||
int ranges_covered, chunk_size, num_of_resources;
|
||||
@ -1079,11 +1078,10 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
metalink_file_t* file;
|
||||
metalink_resource_t* resource;
|
||||
struct s_thread_ctx *thread_ctx;
|
||||
struct range *ranges;
|
||||
|
||||
thread_ctx = malloc (N_THREADS * (sizeof *thread_ctx));
|
||||
ranges = malloc (N_THREADS * (sizeof *ranges));
|
||||
files = malloc (N_THREADS * (sizeof *files));
|
||||
init_ranges (N_THREADS);
|
||||
thread_ctx = malloc (N_THREADS * (sizeof *thread_ctx));
|
||||
|
||||
retries = 0;
|
||||
i = 0;
|
||||
@ -1098,19 +1096,8 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
chunk_size = (file->size) / N_THREADS;
|
||||
if(chunk_size < MIN_CHUNK_SIZE)
|
||||
chunk_size = MIN_CHUNK_SIZE;
|
||||
j = 0;
|
||||
do
|
||||
{
|
||||
ranges[j].first_byte = j * chunk_size;
|
||||
ranges[j].last_byte = (j+1) * chunk_size - 1;
|
||||
ranges[j].bytes_covered = ranges[j].is_assigned = 0;
|
||||
ranges[j].resources = malloc(num_of_resources * sizeof(bool));
|
||||
ranges[j].status_least_severe = RETROK;
|
||||
for (r = 0; r < num_of_resources; ++r)
|
||||
ranges[j].resources[r] = false;
|
||||
++j;
|
||||
} while (ranges[j-1].last_byte < (file->size - 1));
|
||||
ranges[j-1].last_byte = file->size -1;
|
||||
|
||||
j = fill_ranges_data(N_THREADS, num_of_resources, file->size, chunk_size);
|
||||
|
||||
if(j < N_THREADS)
|
||||
N_THREADS = j;
|
||||
@ -1140,7 +1127,6 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
}
|
||||
|
||||
thread_ctx[r].file = files[r];
|
||||
thread_ctx[r].range = ranges + r;
|
||||
thread_ctx[r].referer = NULL;
|
||||
thread_ctx[r].redirected = NULL;
|
||||
thread_ctx[r].dt = dt;
|
||||
@ -1154,12 +1140,11 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
char *error = url_error (thread_ctx[r].url, thread_ctx[r].url_err);
|
||||
logprintf (LOG_NOTQUIET, "%s: %s.\n", thread_ctx[r].url, error);
|
||||
xfree (error);
|
||||
for(r = 0; r < N_THREADS; ++r)
|
||||
free(ranges[r].resources);
|
||||
free(thread_ctx);
|
||||
clean_range_res_data(num_of_resources);
|
||||
clean_ranges ();
|
||||
for (r = 0; r < N_THREADS; ++r)
|
||||
free(files[r]);
|
||||
free(thread_ctx);
|
||||
free(ranges);
|
||||
free(files);
|
||||
return URLERROR;
|
||||
}
|
||||
@ -1212,12 +1197,11 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
char *error = url_error (thread_ctx[r].url, thread_ctx[r].url_err);
|
||||
logprintf (LOG_NOTQUIET, "%s: %s.\n", thread_ctx[r].url, error);
|
||||
xfree (error);
|
||||
for(r = 0; r < N_THREADS; ++r)
|
||||
free(ranges[r].resources);
|
||||
free(thread_ctx);
|
||||
clean_range_res_data(num_of_resources);
|
||||
clean_ranges ();
|
||||
for (r = 0; r < N_THREADS; ++r)
|
||||
free(files[r]);
|
||||
free(thread_ctx);
|
||||
free(ranges);
|
||||
free(files);
|
||||
return URLERROR;
|
||||
}
|
||||
@ -1236,7 +1220,7 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
/* Unlike downloads with invalid hash values, failed download
|
||||
should only be retried if the error causing failure is not
|
||||
an IO error. */
|
||||
if (!(IS_IO_ERROR(ranges[r].status_least_severe)))
|
||||
if (!(IS_IO_ERROR((thread_ctx[r].range)->status_least_severe)))
|
||||
{
|
||||
if(retries < opt.n_retries)
|
||||
{
|
||||
@ -1271,16 +1255,15 @@ retrieve_from_file (const char *file, bool html, int *count)
|
||||
|
||||
delete_temp_files(files, N_THREADS);
|
||||
|
||||
for (j = 0; j < N_THREADS; ++j)
|
||||
free(ranges[j].resources);
|
||||
clean_range_res_data(num_of_resources);
|
||||
for (j = 0; j < N_THREADS; ++j)
|
||||
free(files[j]);
|
||||
++i;
|
||||
}
|
||||
|
||||
free(files);
|
||||
free(ranges);
|
||||
free(thread_ctx);
|
||||
clean_ranges ();
|
||||
free(files);
|
||||
metalink_delete(metalink);
|
||||
}
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user