#!/usr/bin/env bash # Shared, process-safe lock for Gradle and IntelliJ platform test runs. # This file is sourced by jaigradle and jaitest; it is not a standalone command. JAI_GRADLE_LOCK_DIR="${JAI_GRADLE_LOCK_DIR:-.gradle-test.lock}" JAI_GRADLE_LOCK_PID_FILE="$JAI_GRADLE_LOCK_DIR/pid" jai_gradle_lock_acquire() { if [[ "${JAI_GRADLE_LOCK_HELD:-0}" == "1" ]]; then return 0 fi local reported=0 while ! mkdir "$JAI_GRADLE_LOCK_DIR" 2>/dev/null; do if [[ -f "$JAI_GRADLE_LOCK_PID_FILE" ]]; then local owner owner=$(<"$JAI_GRADLE_LOCK_PID_FILE") if [[ "$owner" =~ ^[0-9]+$ ]] && ! kill -0 "$owner" 2>/dev/null; then rm -rf "$JAI_GRADLE_LOCK_DIR" continue fi else # A process can be killed between mkdir and writing its PID. Give that # tiny window a chance to finish, then reclaim the incomplete lock. sleep 1 if [[ ! -f "$JAI_GRADLE_LOCK_PID_FILE" ]]; then rm -rf "$JAI_GRADLE_LOCK_DIR" continue fi fi if ((reported == 0)); then echo "Waiting for another Gradle/test run in this worktree..." >&2 reported=1 fi sleep 1 done printf '%s\n' "$$" >"$JAI_GRADLE_LOCK_PID_FILE" JAI_GRADLE_LOCK_HELD=1 JAI_GRADLE_LOCK_OWNER_PID=$$ export JAI_GRADLE_LOCK_HELD JAI_GRADLE_LOCK_OWNER_PID } jai_gradle_lock_release() { if [[ "${JAI_GRADLE_LOCK_OWNER_PID:-}" == "$$" ]]; then rm -rf "$JAI_GRADLE_LOCK_DIR" unset JAI_GRADLE_LOCK_OWNER_PID JAI_GRADLE_LOCK_HELD fi }