Date: Wed, 23 May 2012 20:47:07 +0000 From: scher@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r236228 - soc2012/scher/par_ports/head/Mk Message-ID: <20120523204707.806D5106566C@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: scher Date: Wed May 23 20:47:06 2012 New Revision: 236228 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236228 Log: [new_feature] ${PKG_DBDIR} and ${.CURDIR} specific lock/unlock [fixed] do-lock do-unlock targets are depricated It is possible to lock/unlock ${PKG_DBDIR} and ${.CURDIR} For loop generates directory specific variable: _parv_PKG_DBDIR_DO_LOCK - lockf command to lock ${PKG_DBDIR} _parv_.CURDIR_DO_LOCK - lockf command to lock ${.CURDIR} _parv_PKG_DBDIR_LOCK_SEQ, _parv_.CURDIR_LOCK_SEQ - sequences of commandes passed to ${SH} lockf command argument. e.g. lockf .lock_file ${SH} -c '_parv_PKG_DBDIR_LOCK_SEQ' _parv_PKG_DBDIR_DO_UNLOCK, _parv_.CURDIR_DO_UNLOCK - lockf command to unlock directories. --------------------------------- do-lock, do-unlock targets are depricated. Their shell scriptes were delegated to above mentioned XXX_DO_LOCK and XXX_DO_UNLOCK variables. Reason: It is necessary to provide locking/unlocking from inside other targets. Usage of locking/unlocking features as dependency targets is insufficient. Modified: soc2012/scher/par_ports/head/Mk/bsd.parallel.mk Modified: soc2012/scher/par_ports/head/Mk/bsd.parallel.mk ============================================================================== --- soc2012/scher/par_ports/head/Mk/bsd.parallel.mk Wed May 23 19:25:46 2012 (r236227) +++ soc2012/scher/par_ports/head/Mk/bsd.parallel.mk Wed May 23 20:47:06 2012 (r236228) @@ -10,26 +10,32 @@ _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} -################# +# End of Debugging specific tools and variable declarations section +##################################################### -################# +##################################################### # Commands _parv_KILL= /bin/kill _parv_KILL_FLAGS= -- -################# + +DO_NADA?= ${TRUE} +# End of Commands section +##################################################### +##################################################### # Locking variables and tools -_parv_DIR_TO_LOCK?=${PORTSDIR}/tmp -_parv_LOCK_FILE= ${_parv_DIR_TO_LOCK}/.lock +PKG_DBDIR?= /var/db/pkg +_parv_LOCK_FILE= .lock _parv_WAIT_FOR_LOCK_TIME= 5 +_parv_WAIT_FOR_UNLOCK_TIME= 15 # 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. @@ -39,45 +45,82 @@ # Stalled locks cheking enabled. # # If the directory is locked then make process will be terminated with 143 exit code. +# If ${_parv_LOCK_FILE} is locked then make process will be terminated with 143 exit code. +# +# For loop produces two varuables: +# _parv_PKG_DBDIR_LOCK_SEQ +# _parv_.CURDIR_LOCK_SEQ +# as sequencies of commands to provide locking of ${PKG_DBDIR} and ${.CURDIR} accordingly. +# +# ${${_lock_dir}} == ${PKG_DBDIR} OR ${.CURDIR} +# +.for _lock_dir in PKG_DBDIR .CURDIR +# _parv_PKG_DBDIR_LOCK_SEQ +# _parv_.CURDIR_LOCK_SEQ # -_parv_LOCK_SEQ= \ - pid=$$(${CAT} ${_parv_LOCK_FILE}); \ +_parv_${_lock_dir}_LOCK_SEQ= \ + pid=$$(${CAT} ${${_lock_dir}}/${_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 ...; \ + ${ECHO_CMD} Unable to lock ${${_lock_dir}}; \ + ${ECHO_CMD} Dir: ${${_lock_dir}} 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} Dir: ${${_lock_dir}} Stalled lock Detected!; \ ${ECHO_CMD} Deleting stalled lock; \ - ${ECHO_CMD} Locking: ${_parv_DIR_TO_LOCK}; \ + ${ECHO_CMD} Locking: ${${_lock_dir}}; \ ${_dparv_END_OUTPUT}; \ - ${ECHO_CMD} ${.MAKE.PID} > ${_parv_LOCK_FILE}; \ + ${ECHO_CMD} ${.MAKE.PID} > ${${_lock_dir}}/${_parv_LOCK_FILE}; \ fi; \ else \ ${_dparv_START_OUTPUT}; \ - ${ECHO_CMD} Locking: ${_parv_DIR_TO_LOCK}; \ + ${ECHO_CMD} Locking: ${${_lock_dir}}; \ ${_dparv_END_OUTPUT}; \ - ${ECHO_CMD} ${.MAKE.PID} > ${_parv_LOCK_FILE}; \ - fi; \ -################# + ${ECHO_CMD} ${.MAKE.PID} > ${${_lock_dir}}/${_parv_LOCK_FILE}; \ + fi +# _parv_PKG_DBDIR_DO_LOCK +# _parv_.CURDIR_DO_LOCK +# +_parv_${_lock_dir}_DO_LOCK= \ + lockf -k -t ${_parv_WAIT_FOR_LOCK_TIME} ${${_lock_dir}}/${_parv_LOCK_FILE} ${SH} -c '${_parv_${_lock_dir}_LOCK_SEQ}' || ( \ + ${_dparv_START_OUTPUT}; \ + ${ECHO_CMD} "Unable to lock ${${_lock_dir}}"; \ + ${ECHO_CMD} "Lock file: ${${_lock_dir}}/${_parv_LOCK_FILE} is alredy locked by another working process ..."; \ + ${_dparv_END_OUTPUT}; \ + ${_parv_KILL} ${_parv_KILL_FLAGS} -${.MAKE.PID}; \ + ) -do-lock: - @lockf -k -t ${_parv_WAIT_FOR_LOCK_TIME} ${_parv_LOCK_FILE} ${SH} -c '${_parv_LOCK_SEQ}' || ( \ +# _parv_PKG_DBDIR_DO_UNLOCK +# _parv_.CURDIR_DO_UNLOCK +# +_parv_${_lock_dir}_DO_UNLOCK= ( \ + lockf -k -t ${_parv_WAIT_FOR_UNLOCK_TIME} ${${_lock_dir}}/${_parv_LOCK_FILE} ${RM} ${${_lock_dir}}/${_parv_LOCK_FILE} || \ + ( \ ${_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 ..."; \ + ${ECHO_CMD} Unable to unlock ${${_lock_dir}}; \ ${_dparv_END_OUTPUT}; \ ${_parv_KILL} ${_parv_KILL_FLAGS} -${.MAKE.PID}; \ - ); \ + ) \ +) && ( \ + ${_dparv_START_OUTPUT}; \ + ${ECHO_CMD} "Dir: ${${_lock_dir}} is unloked"; \ + ${_dparv_END_OUTPUT}; \ +) + +.endfor # _lock_dir in PKG_DBDIR .CURDIR + +# End of Locking variables and tools section +##################################################### + +do-lock: + @${DO_NADA} -# 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} + @${DO_NADA} +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120523204707.806D5106566C>