diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4bee1cd..0e70682 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,10 @@ on: pull_request: workflow_dispatch: +concurrency: # Cancel stale PR builds (but not push builds) + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + jobs: build: strategy: @@ -30,7 +34,7 @@ jobs: shell: bash - target: os: macos - builder: macos-10.15 + builder: macos-12 shell: bash - target: os: windows @@ -43,17 +47,12 @@ jobs: name: '${{ matrix.target.os }}-${{ matrix.target.cpu }} (Nim ${{ matrix.branch }})' runs-on: ${{ matrix.builder }} - continue-on-error: ${{ matrix.branch == 'version-1-6' || matrix.branch == 'devel' }} + continue-on-error: ${{ matrix.branch == 'devel' }} steps: - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.5.0 - with: - access_token: ${{ github.token }} - - name: Checkout uses: actions/checkout@v2 - - name: Install dependencies (Linux i386) + - name: Install build dependencies (Linux i386) if: runner.os == 'Linux' && matrix.target.cpu == 'i386' run: | sudo dpkg --add-architecture i386 @@ -99,23 +98,23 @@ jobs: id: windows-dlls-cache uses: actions/cache@v2 with: - path: external/dlls - key: 'dlls' + path: external/dlls-${{ matrix.target.cpu }} + key: 'dlls-${{ matrix.target.cpu }}' - - name: Install DLL dependencies (Windows) + - name: Install DLLs dependencies (Windows) if: > steps.windows-dlls-cache.outputs.cache-hit != 'true' && runner.os == 'Windows' run: | - mkdir external + mkdir -p external curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip - 7z x external/windeps.zip -oexternal/dlls + 7z x -y external/windeps.zip -oexternal/dlls-${{ matrix.target.cpu }} - name: Path to cached dependencies (Windows) if: > runner.os == 'Windows' run: | - echo '${{ github.workspace }}'"/external/dlls" >> $GITHUB_PATH + echo "${{ github.workspace }}/external/dlls-${{ matrix.target.cpu }}" >> $GITHUB_PATH - name: Derive environment variables run: | @@ -154,5 +153,8 @@ jobs: - name: Run tests run: | - env TEST_LANG=c nimble test - env TEST_LANG=cpp nimble test + nim --version + nimble --version + nimble install -y --depsOnly + env NIMLANG=c nimble test + env NIMLANG=cpp nimble test diff --git a/taskpools.nimble b/taskpools.nimble index 2aef402..1328ce8 100644 --- a/taskpools.nimble +++ b/taskpools.nimble @@ -1,49 +1,50 @@ mode = ScriptMode.Verbose packageName = "taskpools" -version = "0.0.3" +version = "0.0.4" author = "Status Research & Development GmbH" description = "lightweight, energy-efficient, easily auditable threadpool" license = "MIT" +skipDirs = @["tests"] -### Dependencies requires "nim >= 1.2.12" -proc test(flags, path: string) = - if not dirExists "build": - mkDir "build" - # Note: we compile in release mode. This still have stacktraces - # but is much faster than -d:debug +let nimc = getEnv("NIMC", "nim") # Which nim compiler to use +let lang = getEnv("NIMLANG", "c") # Which backend (c/cpp/js) +let flags = getEnv("NIMFLAGS", "") # Extra flags for the compiler +let verbose = getEnv("V", "") notin ["", "0"] - # Compilation language is controlled by TEST_LANG - let lang = getEnv("TEST_LANG", "c") +let styleCheckStyle = if (NimMajor, NimMinor) < (1, 6): "hint" else: "error" +let cfg = + " --styleCheck:usages --styleCheck:" & styleCheckStyle & + (if verbose: "" else: " --verbosity:0 --hints:off") & + " --skipParentCfg --skipUserCfg --outdir:build --nimcache:build/nimcache -f" & + " --stacktrace:on --linetrace:on" & + " --threads:on" - echo "\n========================================================================================" - echo "Running [ ", lang, " ", flags, " ] ", path - echo "========================================================================================" - exec "nim " & lang & " -d:TP_Asserts " & getEnv("NIMFLAGS") & " " & flags & - " --verbosity:0 --warnings:off --threads:on -d:release" & - " --stacktrace:on --linetrace:on --outdir:build -r --skipParentCfg --skipUserCfg" & - " --styleCheck:usages --styleCheck:hint" & - " --hint[XDeclaredButNotUsed]:off --hint[Processing]:off " & path +proc build(args, path: string) = + exec nimc & " " & lang & " " & cfg & " " & flags & " " & args & " " & path + +proc run(args, path: string) = + build args & " -r", path task test, "Run Taskpools tests": # Internal data structures - test "", "taskpools/channels_spsc_single.nim" - test "", "taskpools/sparsesets.nim" + run "", "taskpools/channels_spsc_single.nim" + run "", "taskpools/sparsesets.nim" # Examples - test "", "examples/e01_simple_tasks.nim" - test "", "examples/e02_parallel_pi.nim" + run "", "examples/e01_simple_tasks.nim" + run "", "examples/e02_parallel_pi.nim" # Benchmarks - test "", "benchmarks/dfs/taskpool_dfs.nim" - test "", "benchmarks/heat/taskpool_heat.nim" - test "", "benchmarks/nqueens/taskpool_nqueens.nim" + run "", "benchmarks/dfs/taskpool_dfs.nim" + run "", "benchmarks/heat/taskpool_heat.nim" + run "", "benchmarks/nqueens/taskpool_nqueens.nim" when not defined(windows): - test "", "benchmarks/single_task_producer/taskpool_spc.nim" - test "", "benchmarks/bouncing_producer_consumer/taskpool_bpc.nim" + run "", "benchmarks/single_task_producer/taskpool_spc.nim" + run "", "benchmarks/bouncing_producer_consumer/taskpool_bpc.nim" # TODO - generics in macro issue - # test "", "benchmarks/matmul_cache_oblivious/taskpool_matmul_co.nim" + # run "", "benchmarks/matmul_cache_oblivious/taskpool_matmul_co.nim" diff --git a/taskpools/chase_lev_deques.nim b/taskpools/chase_lev_deques.nim index 10897d4..f0e3d52 100644 --- a/taskpools/chase_lev_deques.nim +++ b/taskpools/chase_lev_deques.nim @@ -37,7 +37,7 @@ import system/ansi_c, - std/[locks, typetraits, atomics], + std/atomics, ./instrumentation/[contracts, loggers], ./primitives/allocs diff --git a/taskpools/flowvars.nim b/taskpools/flowvars.nim index 1e55ad0..ec2eef2 100644 --- a/taskpools/flowvars.nim +++ b/taskpools/flowvars.nim @@ -6,7 +6,6 @@ # at your option. This file may not be copied, modified, or distributed except according to those terms. import - system/ansi_c, std/os, ./instrumentation/contracts, ./channels_spsc_single,