Date: Wed, 23 May 2012 17:03:01 +0000 From: scher@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r236215 - soc2012/scher/par_ports/head/Mk Message-ID: <20120523170301.84956106564A@hub.freebsd.org>
index | next in thread | raw e-mail
Author: scher Date: Wed May 23 17:03:01 2012 New Revision: 236215 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236215 Log: [new_feature] directory locking targets Two directory locking targets (do-lock, do-unlock) are implemented in bsd.parallel.mk file. This targets provide atomic locking/unlocking technique to lock/unlock a directory specified by ${_parv_DIR_TO_LOCK} variable. Submitted by: Alexander Pronin Added: soc2012/scher/par_ports/head/Mk/bsd.parallel.mk Added: soc2012/scher/par_ports/head/Mk/bsd.parallel.mk ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2012/scher/par_ports/head/Mk/bsd.parallel.mk Wed May 23 17:03:01 2012 (r236215) @@ -0,0 +1,83 @@ +#-*- mode: Fundamental; tab-width: 4; -*- +# ex:ts=4 +# +# $FreeBSD$ +# +# Please view me with 4 column tabs! + +.include <bsd.commands.mk> + + +_dparv_= +_parv_= +################# +# Debugging specific tools and variable declarations +_dparv_START_OUTPUT_MESSAGE= "=================_PAR_PORTS_SPECIFIC_OUTPUT_==============" +_dparv_END_OUTPUT_MESSAGE= "==============_END_OF_PAR_PORTS_SPECIFIC_OUTPUT_==============" + +_dparv_START_OUTPUT= ${ECHO_CMD} ${_dparv_START_OUTPUT_MESSAGE} +_dparv_END_OUTPUT= ${ECHO_CMD} ${_dparv_END_OUTPUT_MESSAGE} +################# + + +################# +# Commands +_parv_KILL= /bin/kill +_parv_KILL_FLAGS= -- +################# +# Locking variables and tools +_parv_DIR_TO_LOCK?=${PORTSDIR}/tmp +_parv_LOCK_FILE= ${_parv_DIR_TO_LOCK}/.lock + +_parv_WAIT_FOR_LOCK_TIME= 5 + +# Senquence of commands to lock a directory using ${_parv_LOCK_FILE}. +# During evaluation of the following commands lockf(1) is holding lock on ${_parv_LOCK_FILE} file. +# Hence NO other process is able to evaluate any commands using lockf(1) +# locking on the same ${_parv_LOCK_FILE} file. +# +# Stalled locks cheking enabled. +# +# If the directory is locked then make process will be terminated with 143 exit code. +# +_parv_LOCK_SEQ= \ + pid=$$(${CAT} ${_parv_LOCK_FILE}); \ + if [ $${pid} ]; then \ + pgrep -P $${pid} > /dev/null; \ + status=$$(${ECHO_CMD} $$?); \ + if [ $${status} -eq 0 ]; then \ + ${_dparv_START_OUTPUT}; \ + ${ECHO_CMD} Unable to lock ${_parv_DIR_TO_LOCK}; \ + ${ECHO_CMD} Dir: ${_parv_DIR_TO_LOCK} is already locked by another working process ...; \ + ${_dparv_END_OUTPUT}; \ + ${_parv_KILL} ${_parv_KILL_FLAGS} -${.MAKE.PID}; \ + else \ + ${_dparv_START_OUTPUT}; \ + ${ECHO_CMD} Dir: ${_parv_DIR_TO_LOCK} Stalled lock Detected!; \ + ${ECHO_CMD} Deleting stalled lock; \ + ${ECHO_CMD} Locking: ${_parv_DIR_TO_LOCK}; \ + ${_dparv_END_OUTPUT}; \ + ${ECHO_CMD} ${.MAKE.PID} > ${_parv_LOCK_FILE}; \ + fi; \ + else \ + ${_dparv_START_OUTPUT}; \ + ${ECHO_CMD} Locking: ${_parv_DIR_TO_LOCK}; \ + ${_dparv_END_OUTPUT}; \ + ${ECHO_CMD} ${.MAKE.PID} > ${_parv_LOCK_FILE}; \ + fi; \ +################# + + +do-lock: + @lockf -k -t ${_parv_WAIT_FOR_LOCK_TIME} ${_parv_LOCK_FILE} ${SH} -c '${_parv_LOCK_SEQ}' || ( \ + ${_dparv_START_OUTPUT}; \ + ${ECHO_CMD} "Unable to lock ${_parv_DIR_TO_LOCK}"; \ + ${ECHO_CMD} "Lock file: ${_parv_LOCK_FILE} is alredy locked by another working process ..."; \ + ${_dparv_END_OUTPUT}; \ + ${_parv_KILL} ${_parv_KILL_FLAGS} -${.MAKE.PID}; \ + ); \ + +# In this target there is no timeout, because if it is necessary to unlock dir then +# this process has to wait until all other registered to lockf(1) operation processes do their stuff. +do-unlock: + @lockf -k ${_parv_LOCK_FILE} ${RM} ${_parv_LOCK_FILE}help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120523170301.84956106564A>
