[macppc/ports-gcc] Unbreak benchmarks/wrk

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[macppc/ports-gcc] Unbreak benchmarks/wrk

Charlene Wendling

> http://build-failures.rhaalovely.net/powerpc/2019-07-29/benchmarks/wrk.log

It requires a move from __sync to __atomic. Debian did that already [0],
so i've taken their stuff.

While wrk is written in C, the use of __atomic functions requires
estdc++ and ports-gcc (we can't use COMPILER_LANGS=c).

It builds [1] and runs fine on macppc and amd64 with multiple threads.

Comments/feedback are welcome,

Charlène.


[0] https://sources.debian.org/patches/wrk/4.0.2-2/debian-changes/
[1] https://bin.charlenew.xyz/wrk.log


Index: Makefile
===================================================================
RCS file: /cvs/ports/benchmarks/wrk/Makefile,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 Makefile
--- Makefile 12 Jul 2019 20:43:43 -0000 1.2
+++ Makefile 12 Aug 2019 19:40:01 -0000
@@ -5,6 +5,7 @@ COMMENT = modern HTTP benchmarking tool
 GH_ACCOUNT = wg
 GH_PROJECT = wrk
 GH_TAGNAME = 4.1.0
+REVISION = 0
 
 CATEGORIES = benchmarks
 
@@ -15,6 +16,9 @@ PERMIT_PACKAGE = Yes
 
 WANTLIB += c crypto luajit-5.1 m pthread ssl
 
+# __atomic support (GCC>4.7.4)
+COMPILER = base-clang ports-gcc
+
 LIB_DEPENDS = lang/luajit
 
 USE_GMAKE = Yes
@@ -26,6 +30,12 @@ MAKE_ENV = WITH_LUAJIT=${LOCALBASE} WITH
 MAKE_ENV += LIBS=-lc++abi
 WANTLIB += c++abi
 .endif
+
+.if ${MACHINE_ARCH:Mhppa} || ${MACHINE_ARCH:Mpowerpc}
+MAKE_ENV += LIBS=-latomic
+WANTLIB += atomic
+.endif
+
 
 NO_TEST = Yes
 
Index: patches/patch-src_stats_c
===================================================================
RCS file: patches/patch-src_stats_c
diff -N patches/patch-src_stats_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_stats_c 12 Aug 2019 19:40:01 -0000
@@ -0,0 +1,33 @@
+$OpenBSD$
+
+ppc, hppa: we can't use 64-bit __sync operators there
+
+Index: src/stats.c
+--- src/stats.c.orig
++++ src/stats.c
+@@ -21,12 +21,21 @@ void stats_free(stats *stats) {
+
+ int stats_record(stats *stats, uint64_t n) {
+     if (n >= stats->limit) return 0;
+-    __sync_fetch_and_add(&stats->data[n], 1);
+-    __sync_fetch_and_add(&stats->count, 1);
++    __atomic_fetch_add(&stats->data[n], 1, __ATOMIC_SEQ_CST);
++    __atomic_fetch_add(&stats->count, 1, __ATOMIC_SEQ_CST);
+     uint64_t min = stats->min;
+     uint64_t max = stats->max;
+-    while (n < min) min = __sync_val_compare_and_swap(&stats->min, min, n);
+-    while (n > max) max = __sync_val_compare_and_swap(&stats->max, max, n);
++    while (n < min) {
++        __atomic_compare_exchange(&stats->min, &min, &n, false,
++                                  __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
++        min = stats->min;
++    }
++    while (n > max) {
++        __atomic_compare_exchange(&stats->max, &max, &n, false,
++                                  __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
++        max = stats->max;
++   }
++
+     return 1;
+ }
+