mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +00:00
config/functions: discriminate lock ownership by job/seq not just job
This commit is contained in:
parent
3958acdb82
commit
35266cf938
@ -1215,17 +1215,17 @@ pkg_lock() {
|
||||
|
||||
local pkg="$1" task="$2" parent_pkg="$3"
|
||||
local this_job="${MTJOBID}"
|
||||
local lock_job lock_task lock_pkg
|
||||
local lock_job lock_seq lock_task lock_pkg
|
||||
local fail_seq
|
||||
|
||||
exec 98>"${THREAD_CONTROL}/locks/${pkg}.${task}"
|
||||
if ! flock --nonblock --exclusive 98; then
|
||||
while [ : ]; do
|
||||
read -r lock_job lock_task lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/${pkg}.${task}.owner" 2>/dev/null)
|
||||
read -r lock_job lock_seq lock_task lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/${pkg}.${task}.owner" 2>/dev/null)
|
||||
[ -n "${lock_job}" ] && break || sleep 1
|
||||
done
|
||||
|
||||
if [ ${lock_job} != ${this_job} ]; then
|
||||
if [ "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then
|
||||
pkg_lock_status "STALLED" "${parent_pkg}" "${task}" "$(printf "waiting on [%02d] %s %s" ${lock_job} "${lock_task}" "${lock_pkg}")"
|
||||
flock --exclusive 98
|
||||
fi
|
||||
@ -1247,8 +1247,6 @@ EOF
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "${this_job} ${task} ${pkg}" >"${THREAD_CONTROL}/locks/${pkg}.${task}.owner"
|
||||
|
||||
pkg_lock_status "LOCKED" "${pkg}" "${task}"
|
||||
}
|
||||
|
||||
@ -1269,6 +1267,7 @@ pkg_lock_status() {
|
||||
|
||||
if [ "${status}" = "LOCKED" ]; then
|
||||
echo "${PARALLEL_SEQ}" > "${THREAD_CONTROL}/locks/${pkg}.${task}.failed"
|
||||
echo "${this_job} ${PARALLEL_SEQ} ${task} ${pkg}" >"${THREAD_CONTROL}/locks/${pkg}.${task}.owner"
|
||||
elif [ "${status}" = "UNLOCK" ]; then
|
||||
rm "${THREAD_CONTROL}/locks/${pkg}.${task}.failed"
|
||||
fi
|
||||
@ -1332,23 +1331,24 @@ acquire_exclusive_lock() {
|
||||
|
||||
local pkg="$1" task="$2" lockfile="${3:-global}"
|
||||
local this_job="${MTJOBID}"
|
||||
local lock_job lock_task lock_pkg
|
||||
local lock_job lock_seq lock_task lock_pkg
|
||||
|
||||
exec 96>"${THREAD_CONTROL}/locks/.mutex.${lockfile}"
|
||||
if ! flock --nonblock --exclusive 96; then
|
||||
while [ : ]; do
|
||||
read -r lock_job lock_task lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner" 2>/dev/null)
|
||||
read -r lock_job lock_seq lock_task lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner" 2>/dev/null)
|
||||
[ -n "${lock_job}" ] && break || sleep 1
|
||||
done
|
||||
|
||||
if [ ${lock_job} != ${this_job} ]; then
|
||||
if [ "${lock_job}/${lock_seq}" != "${this_job}/${PARALLEL_SEQ}" ]; then
|
||||
pkg_lock_status "MUTEX/W" "${pkg}" "${task}" "$(printf "mutex: %s; waiting on [%02d] %s %s" "${lockfile}" ${lock_job} "${lock_task}" "${lock_pkg}")"
|
||||
flock --exclusive 96
|
||||
fi
|
||||
fi
|
||||
echo "${this_job} ${task} ${pkg}" >"${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner"
|
||||
|
||||
pkg_lock_status "MUTEX" "${pkg}" "${task}" "mutex: ${lockfile}"
|
||||
|
||||
echo "${this_job} ${PARALLEL_SEQ} ${task} ${pkg}" >"${THREAD_CONTROL}/locks/.mutex.${lockfile}.owner"
|
||||
}
|
||||
|
||||
release_exclusive_lock() {
|
||||
@ -1356,9 +1356,9 @@ release_exclusive_lock() {
|
||||
|
||||
local pkg="$1" task="$2"
|
||||
|
||||
flock --unlock 96 2>/dev/null
|
||||
|
||||
pkg_lock_status "ACTIVE" "${pkg}" "${task}"
|
||||
|
||||
flock --unlock 96 2>/dev/null
|
||||
}
|
||||
|
||||
# Execute single command using mutex
|
||||
|
Loading…
x
Reference in New Issue
Block a user