Transfer struct range array to multi.c. Delete to redundant variables in retr.c.

This commit is contained in:
Ilim Ugur 2012-08-16 14:22:08 +03:00
parent f51826d9d8
commit c25d01feb7
3 changed files with 67 additions and 31 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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