prioritize direct download for non existing redirections
allocate the direct download slot from server if there are no redirections and no other client is currently downloading this file already.master
parent
88e02d424b
commit
3e0254bf3c
25
src/core.c
25
src/core.c
|
@ -352,6 +352,21 @@ void tip_client_pending(struct tip_client *cli)
|
|||
cli->state = TIP_CLIENT_PENDING;
|
||||
}
|
||||
|
||||
static bool tip_direct_download_in_progress(const struct tip_client *cli)
|
||||
{
|
||||
struct tip_client *this;
|
||||
|
||||
list_for_each_entry(this, &client_list, list) {
|
||||
if (cli->addr.sin_addr.s_addr == this->addr.sin_addr.s_addr)
|
||||
continue;
|
||||
if (cli->state != TIP_CLIENT_PENDING &&
|
||||
!strcmp(cli->path, this->path))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void tip_client_activate_pending(bool redirect_only)
|
||||
{
|
||||
struct tip_client *cli, *next;
|
||||
|
@ -361,9 +376,13 @@ void tip_client_activate_pending(bool redirect_only)
|
|||
if (cli->state != TIP_CLIENT_PENDING)
|
||||
continue;
|
||||
redirected = tip_client_redirect(cli);
|
||||
if (!redirected && redirect_only)
|
||||
continue;
|
||||
|
||||
if (!redirected) {
|
||||
if (redirect_only)
|
||||
continue;
|
||||
/* another client is fetching this file from server, skip. */
|
||||
if (tip_direct_download_in_progress(cli))
|
||||
continue;
|
||||
}
|
||||
ev_io_set(&cli->io, tip_client_socket(cli), EV_READ | EV_WRITE);
|
||||
ev_io_start(tip_main_loop, &cli->io);
|
||||
ev_timer_again(tip_main_loop, &cli->timer);
|
||||
|
|
Loading…
Reference in New Issue