From ff8f6127fcec54a86f8a7f9d2c272e5591a720d0 Mon Sep 17 00:00:00 2001 From: Aoran Zeng Date: Wed, 4 Sep 2024 00:27:05 +0800 Subject: [PATCH] Measured in group --- include/chsrc.h | 184 ++++++++++++++++++++++++++++-------------------- 1 file changed, 109 insertions(+), 75 deletions(-) diff --git a/include/chsrc.h b/include/chsrc.h index 4c5f3d1..e8729c4 100644 --- a/include/chsrc.h +++ b/include/chsrc.h @@ -7,7 +7,7 @@ * Contributors : Peng Gao * | * Created on : <2023-08-29> - * Last modified : <2024-09-03> + * Last modified : <2024-09-04> * * chsrc 头文件 * ------------------------------------------------------------*/ @@ -18,6 +18,9 @@ #define App_Name "chsrc" +static int chsrc_get_cpucore (); + + /* 命令行选项 */ bool CliOpt_IPv6 = false; bool CliOpt_Locally = false; @@ -486,6 +489,95 @@ get_max_ele_idx_in_dbl_ary (double *array, int size) return maxidx; } + +/** + * @param size 分组大小 + * @param whole_sources 被分组的整体 + * @param whole_speeds 被分组的整体的速度值记录 + * @param grp_cursor_in_whole 分组在整体的下标中所处的位置 + */ +void +measure_speed_in_group (int size, SourceInfo whole_sources[], double whole_speeds[], int grp_cursor_in_whole) +{ + bool get_measured[size]; /* 是否测速了 */ + int get_measured_n = 0; /* 测速了几个 */ + char *measure_msgs[size]; + + double speed = 0.0; + + pthread_t *threads = xy_malloc0 (sizeof(pthread_t) * size); + + for (int i=0; i__bigfile_url; + if (NULL==url) + { + if (xy_streql ("upstream", src.mirror->code)) + { + speed = 0; // 上游源不测速,直接置0 + } + else + { + char *msg1 = CliOpt_InEnglish ? "Dev team doesn't offer " : "开发者未提供 "; + char *msg2 = CliOpt_InEnglish ? " mirror site's speed measurement link,so skip it" : " 镜像站测速链接,跳过该站点"; + chsrc_warn (xy_strjoin (3, msg1, src.mirror->code, msg2)); + speed = 0; + } + whole_speeds[i+grp_cursor_in_whole] = speed; + get_measured[i] = false; + measure_msgs[i] = NULL; + } + else + { + const char *msg = CliOpt_InEnglish ? src.mirror->abbr : src.mirror->name; + measure_msgs[i] = xy_strjoin (3, " - ", msg, " ... "); + printf ("%s", measure_msgs[i]); + say (""); + // fflush (stdout); + + char *url_ = xy_strdup (url); + // say (url); + int ret = pthread_create (&threads[i], NULL, measure_speed, url_); + if (ret!=0) + { + chsrc_error ("Unable to measure speed\n"); + exit (Exit_UserCause); + } + else + { + get_measured[i] = true; + get_measured_n += 1; + } + } + } + + + /* 一组汇总 */ + char **curl_results = xy_malloc0 (sizeof(char *) * size); + for (int i=0; i cpu_cores ? cpu_cores : (size-1); + int ngroup = (size-1) / group_size; + int rest = (size-1) % group_size; - pthread_t *threads = xy_malloc0 (sizeof(pthread_t) * size); + // 跳过 upstream + speed_records[0] = 0.0; + int grp_cursor = 1; - for (int i=0; i__bigfile_url; - if (NULL==url) - { - if (xy_streql ("upstream", src.mirror->code)) - { - speed = 0; // 上游源不测速,直接置0 - } - else - { - char *msg1 = CliOpt_InEnglish ? "Dev team doesn't offer " : "开发者未提供 "; - char *msg2 = CliOpt_InEnglish ? " mirror site's speed measurement link,so skip it" : " 镜像站测速链接,跳过该站点"; - chsrc_warn (xy_strjoin (3, msg1, src.mirror->code, msg2)); - speed = 0; - } - speeds[i] = speed; - get_measured[i] = false; - measure_msgs[i] = NULL; - } - else - { - const char *msg = CliOpt_InEnglish ? src.mirror->abbr : src.mirror->name; - measure_msgs[i] = xy_strjoin (3, " - ", msg, " ... "); - printf ("%s", measure_msgs[i]); - say (""); - // fflush (stdout); + for (int i=0; i 0) + measure_speed_in_group (rest, sources, speed_records, grp_cursor); - char *url_ = xy_strdup (url); - int ret = pthread_create (&threads[i], NULL, measure_speed, url_); - if (ret!=0) - { - chsrc_error ("Unable to measure speed\n"); - exit (Exit_UserCause); - } - else - { - get_measured[i] = true; - get_measured_n += 1; - } - } - } - - - /* 汇总 */ - char **curl_results = xy_malloc0 (sizeof(char *) * size); - for (int i=0; i