v4.1.0
v4.1.0
May 28, 2026 · GitHub ↗
Java. That's the headline.
gempba is now a Maven dependency. Drop it into a pom.xml, write import io.gempba.*, and call the same scheduler family, load balancer, and node manager you would from C++ — just from Java this time. One fat JAR per flavor (mt, mp-mpi) carries the native binaries for Linux, Windows, and macOS inside the artifact, so there is no per-platform build dance, no classifier juggling, no "first set LD_LIBRARY_PATH" footnote. You add the dependency, you build, you run.
That this is shippable at all is because of the second piece of v4.1.0: a stable C ABI underneath. The Java binding is the first consumer of it, but the same headers are what any future Python / Rust / .NET binding will sit on. If you have a JVM pipeline, a Spark job, an Airflow operator, an enterprise application — anywhere C++ was the wrong language but you still wanted gempba's scheduler — that bridge now exists.
Everything else in v4.1.0 is the surrounding work: the publish pipeline, the README the new Java audience needs, a couple of bug fixes. No public C++ API changes — additive on top of v4.0.0.
Added
- Stable C ABI (
<gempba/cabi/gempba.h>) — extern-C surface covering the full runtime: scheduler family, load balancer, node manager, factories, runnables, MP / MT entry points, per-node result retrieval. The same headers any non-C++ binding will reuse going forward (#185) - Java JNI binding (
io.gempba:gempba) — typed wrappers forNode,LoadBalancer,NodeManager,RankStats,Score/ScoreType,Goal,BalancingPolicy, the task / serializer / deserializer functional interfaces, the scheduler family (MP-only), andGemPBAentry points for both flavors (#186) - Multi-platform fat JAR — each published JAR carries
natives/<os>-<arch>/for Linuxx86_64, Windowsx86_64, and macOSaarch64.NativeLoaderpicks the right binary at runtime, so the same JAR runs unchanged on any supported platform. No per-OS classifier, no platform-specific Maven profiles (#274) - Maven publication to GitHub Packages on every
v*tag, with classifiersmt(multithreading) andmp-mpi(multiprocessing). Add the repo to yoursettings.xml, declare the dependency with the classifier you want, build (#187) - README "Maven dependency (Java)" subsection — repository +
settings.xml+ dependency snippet, plus a cutoff note that Maven artifacts start atv4.1.0(earlier tags predate the publish flow). Platforms section gains a per-OS architecture table (#283)
Fixed
default_mpi_stats_visitor::labels()was missing thetotal_thread_requestskey — values were emitted but the label vector didn't cover them, breaking downstream consumers that zipped labels with values (#262)set_thread_pool_sizecould race against in-flight construction; the resize now round-trips a no-op task to fence the pool's worker threads before returning (#277)
Build
- CI workflows split into mutually exclusive triggers:
ci-*.ymlruns on PRs and branch pushes,release-*.ymlruns on tags. Reusable building blocks factored out so tag-time publish reuses the exact build path CI exercises (#265) - Workflow folder reorganized with
ci-/release-prefixes, a.github/workflows/README.md, and shared composite actions extracted (#271) prepare-release.ymlnow bumpsbindings/java/pom.xml's<version>alongside the CMake / PKGBUILD bumps so the Java release version stays in lockstep with the C++ release version (#187)- Lint workflow bumped to LLVM 22; the modernizations clang-tidy 22 flagged were applied (#261)