From 0d33774b9bd3b54eabf61eb6c52a71ddaf9a76aa Mon Sep 17 00:00:00 2001 From: cyliang368 Date: Fri, 25 Jul 2025 18:26:51 -0700 Subject: [PATCH 1/3] add omp critical block to fprintf that may cause write out conflicts --- lib/gis/percent.c | 78 ++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/lib/gis/percent.c b/lib/gis/percent.c index 84c40eb4ed6..11c4a70c406 100644 --- a/lib/gis/percent.c +++ b/lib/gis/percent.c @@ -70,30 +70,34 @@ void G_percent(long n, long d, int s) if (format == G_INFO_FORMAT_SILENT || G_verbose() < 1) return; - if (n <= 0 || n >= d || x > st->prev + s) { - st->prev = x; +#pragma omp critical + { + if (n <= 0 || n >= d || x > st->prev + s) { + st->prev = x; - if (ext_percent) { - ext_percent(x); - } - else { - if (format == G_INFO_FORMAT_STANDARD) { - fprintf(stderr, "%4d%%\b\b\b\b\b", x); + if (ext_percent) { + ext_percent(x); } else { - if (format == G_INFO_FORMAT_PLAIN) { - if (x == 100) - fprintf(stderr, "%d\n", x); - else - fprintf(stderr, "%d..", x); + if (format == G_INFO_FORMAT_STANDARD) { + // fprintf(stderr, "%4d%%\b\b\b\b\b", x); + fprintf(stderr, "%d ", x); } - else { /* GUI */ - if (st->first) { - fprintf(stderr, "\n"); + else { + if (format == G_INFO_FORMAT_PLAIN) { + if (x == 100) + fprintf(stderr, "%d\n", x); + else + fprintf(stderr, "%d..", x); + } + else { /* GUI */ + if (st->first) { + fprintf(stderr, "\n"); + } + fprintf(stderr, "GRASS_INFO_PERCENT: %d\n", x); + fflush(stderr); + st->first = 0; } - fprintf(stderr, "GRASS_INFO_PERCENT: %d\n", x); - fflush(stderr); - st->first = 0; } } } @@ -104,7 +108,10 @@ void G_percent(long n, long d, int s) ext_percent(100); } else if (format == G_INFO_FORMAT_STANDARD) { - fprintf(stderr, "\n"); +#pragma omp critical + { + fprintf(stderr, "\n"); + } } st->prev = -1; st->first = 1; @@ -165,21 +172,24 @@ void G_progress(long n, int s) if (format == G_INFO_FORMAT_SILENT || G_verbose() < 1) return; - if (n == s && n == 1) { - if (format == G_INFO_FORMAT_PLAIN) - fprintf(stderr, "\n"); - else if (format != G_INFO_FORMAT_GUI) - fprintf(stderr, "\r"); - return; - } +#pragma omp critical + { + if (n == s && n == 1) { + if (format == G_INFO_FORMAT_PLAIN) + fprintf(stderr, "\n"); + else if (format != G_INFO_FORMAT_GUI) + fprintf(stderr, "\r"); + return; + } - if (n % s == 0) { - if (format == G_INFO_FORMAT_PLAIN) - fprintf(stderr, "%ld..", n); - else if (format == G_INFO_FORMAT_GUI) - fprintf(stderr, "GRASS_INFO_PROGRESS: %ld\n", n); - else - fprintf(stderr, "%10ld\b\b\b\b\b\b\b\b\b\b", n); + if (n % s == 0) { + if (format == G_INFO_FORMAT_PLAIN) + fprintf(stderr, "%ld..", n); + else if (format == G_INFO_FORMAT_GUI) + fprintf(stderr, "GRASS_INFO_PROGRESS: %ld\n", n); + else + fprintf(stderr, "%10ld\b\b\b\b\b\b\b\b\b\b", n); + } } } From 5d26b1e7d0256043249c0371b24f051a528f87a5 Mon Sep 17 00:00:00 2001 From: cyliang368 Date: Fri, 25 Jul 2025 18:48:09 -0700 Subject: [PATCH 2/3] make the omp critical block not contain return --- lib/gis/percent.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/gis/percent.c b/lib/gis/percent.c index 11c4a70c406..fb63ea715b2 100644 --- a/lib/gis/percent.c +++ b/lib/gis/percent.c @@ -172,23 +172,28 @@ void G_progress(long n, int s) if (format == G_INFO_FORMAT_SILENT || G_verbose() < 1) return; -#pragma omp critical { if (n == s && n == 1) { - if (format == G_INFO_FORMAT_PLAIN) - fprintf(stderr, "\n"); - else if (format != G_INFO_FORMAT_GUI) - fprintf(stderr, "\r"); +#pragma omp critical + { + if (format == G_INFO_FORMAT_PLAIN) + fprintf(stderr, "\n"); + else if (format != G_INFO_FORMAT_GUI) + fprintf(stderr, "\r"); + } return; } if (n % s == 0) { - if (format == G_INFO_FORMAT_PLAIN) - fprintf(stderr, "%ld..", n); - else if (format == G_INFO_FORMAT_GUI) - fprintf(stderr, "GRASS_INFO_PROGRESS: %ld\n", n); - else - fprintf(stderr, "%10ld\b\b\b\b\b\b\b\b\b\b", n); +#pragma omp critical + { + if (format == G_INFO_FORMAT_PLAIN) + fprintf(stderr, "%ld..", n); + else if (format == G_INFO_FORMAT_GUI) + fprintf(stderr, "GRASS_INFO_PROGRESS: %ld\n", n); + else + fprintf(stderr, "%10ld\b\b\b\b\b\b\b\b\b\b", n); + } } } } From 6a4235147a62bfb47e6ed696afe45c84d0f873bc Mon Sep 17 00:00:00 2001 From: cyliang368 Date: Sat, 26 Jul 2025 11:04:15 -0700 Subject: [PATCH 3/3] remove the testing line to make percentage print out in the same place --- lib/gis/percent.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/gis/percent.c b/lib/gis/percent.c index fb63ea715b2..44981588c98 100644 --- a/lib/gis/percent.c +++ b/lib/gis/percent.c @@ -80,8 +80,7 @@ void G_percent(long n, long d, int s) } else { if (format == G_INFO_FORMAT_STANDARD) { - // fprintf(stderr, "%4d%%\b\b\b\b\b", x); - fprintf(stderr, "%d ", x); + fprintf(stderr, "%4d%%\b\b\b\b\b", x); } else { if (format == G_INFO_FORMAT_PLAIN) {