From 3e0254bf3cf9f0e8b0eef124530aa97f528c056b Mon Sep 17 00:00:00 2001 From: tiptorrent development team Date: Mon, 20 Sep 2021 01:33:18 +0200 Subject: 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. --- src/core.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/core.c b/src/core.c index 688f059..ff471cc 100644 --- a/src/core.c +++ b/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); -- cgit v1.2.3-18-g5258