| @@ -1,168 +1,168 @@ | | | @@ -1,168 +1,168 @@ |
1 | # $NetBSD: locking.mk,v 1.9 2007/03/16 20:41:44 rillig Exp $ | | 1 | # $NetBSD: locking.mk,v 1.10 2018/02/19 13:00:10 rillig Exp $ |
2 | # | | 2 | # |
3 | # User-settable variables: | | 3 | # User-settable variables: |
4 | # | | 4 | # |
5 | # WRKDIR_LOCKTYPE | | 5 | # WRKDIR_LOCKTYPE |
6 | # The type of locking used for WRKDIR. | | 6 | # The type of locking used for WRKDIR. |
7 | # | | 7 | # |
8 | # Possible values: none once sleep | | 8 | # Possible values: none once sleep |
9 | # Default value: none | | 9 | # Default value: none |
10 | # Recommended: once | | 10 | # Recommended: once |
11 | # | | 11 | # |
12 | # LOCALBASE_LOCKTYPE | | 12 | # LOCALBASE_LOCKTYPE |
13 | # The type of locking used for LOCALBASE. | | 13 | # The type of locking used for LOCALBASE. |
14 | # | | 14 | # |
15 | # Possible values: none once sleep | | 15 | # Possible values: none once sleep |
16 | # Default value: none | | 16 | # Default value: none |
17 | # Recommended: sleep | | 17 | # Recommended: sleep |
18 | # | | 18 | # |
19 | # See also: PKGSRC_LOCKTYPE. | | 19 | # See also: PKGSRC_LOCKTYPE. |
20 | # | | 20 | # Keywords: lock locking parallel |
21 | | | 21 | |
22 | # This file provides the following .USE targets: | | 22 | # This file provides the following .USE targets: |
23 | # | | 23 | # |
24 | # acquire-lock | | 24 | # acquire-lock |
25 | # Acquires a coarse-grained lock in WRKDIR. | | 25 | # Acquires a coarse-grained lock in WRKDIR. |
26 | # | | 26 | # |
27 | # release-lock | | 27 | # release-lock |
28 | # Releases the lock in WRKDIR. | | 28 | # Releases the lock in WRKDIR. |
29 | # | | 29 | # |
30 | # acquire-localbase-lock | | 30 | # acquire-localbase-lock |
31 | # Acquires a coarse-grained lock in LOCALBASE. | | 31 | # Acquires a coarse-grained lock in LOCALBASE. |
32 | # | | 32 | # |
33 | # release-localbase-lock | | 33 | # release-localbase-lock |
34 | # Releases the lock in LOCALBASE. | | 34 | # Releases the lock in LOCALBASE. |
35 | # | | 35 | # |
36 | | | 36 | |
37 | WRKDIR_LOCKTYPE?= ${PKGSRC_LOCKTYPE} | | 37 | WRKDIR_LOCKTYPE?= ${PKGSRC_LOCKTYPE} |
38 | LOCALBASE_LOCKTYPE?= ${PKGSRC_LOCKTYPE} | | 38 | LOCALBASE_LOCKTYPE?= ${PKGSRC_LOCKTYPE} |
39 | | | 39 | |
40 | _WRKDIR_LOCKFILE= ${WRKDIR}/.lockfile | | 40 | _WRKDIR_LOCKFILE= ${WRKDIR}/.lockfile |
41 | _LOCALBASE_LOCKFILE= ${LOCALBASE}/.lockfile | | 41 | _LOCALBASE_LOCKFILE= ${LOCALBASE}/.lockfile |
42 | _LOCKVARS= WRKDIR_LOCKTYPE LOCALBASE_LOCKTYPE | | 42 | _LOCKVARS= WRKDIR_LOCKTYPE LOCALBASE_LOCKTYPE |
43 | | | 43 | |
44 | # | | 44 | # |
45 | # Sanity checks. | | 45 | # Sanity checks. |
46 | # | | 46 | # |
47 | | | 47 | |
48 | .for v in ${_LOCKVARS} | | 48 | .for v in ${_LOCKVARS} |
49 | _OK= no | | 49 | _OK= no |
50 | . for t in none once sleep | | 50 | . for t in none once sleep |
51 | . if ${${v}} == "${t}" | | 51 | . if ${${v}} == "${t}" |
52 | _OK= yes | | 52 | _OK= yes |
53 | . endif | | 53 | . endif |
54 | . endfor | | 54 | . endfor |
55 | . if ${_OK} != "yes" | | 55 | . if ${_OK} != "yes" |
56 | PKG_FAIL_REASON+= "[locking.mk] ${v} must be one of { none once sleep }, not ${${v}}." | | 56 | PKG_FAIL_REASON+= "[locking.mk] ${v} must be one of { none once sleep }, not ${${v}}." |
57 | . endif | | 57 | . endif |
58 | .endfor | | 58 | .endfor |
59 | | | 59 | |
60 | # | | 60 | # |
61 | # Needed tools. | | 61 | # Needed tools. |
62 | # | | 62 | # |
63 | | | 63 | |
64 | .for v in ${_LOCKVARS} | | 64 | .for v in ${_LOCKVARS} |
65 | . if ${${v}} != "none" | | 65 | . if ${${v}} != "none" |
66 | USE_TOOLS+= shlock | | 66 | USE_TOOLS+= shlock |
67 | . endif | | 67 | . endif |
68 | . if ${${v}} == "sleep" | | 68 | . if ${${v}} == "sleep" |
69 | USE_TOOLS+= sleep | | 69 | USE_TOOLS+= sleep |
70 | . endif | | 70 | . endif |
71 | .endfor | | 71 | .endfor |
72 | | | 72 | |
73 | # | | 73 | # |
74 | # The commands. | | 74 | # The commands. |
75 | # | | 75 | # |
76 | | | 76 | |
77 | _CHECK_IF_SHLOCK_IS_AVAILABLE_CMD= \ | | 77 | _CHECK_IF_SHLOCK_IS_AVAILABLE_CMD= \ |
78 | [ "${PKGPATH}" != "pkgtools/shlock" ] || exit 0; \ | | 78 | [ "${PKGPATH}" != "pkgtools/shlock" ] || exit 0; \ |
79 | [ -x ${SHLOCK:Q}"" ] || { \ | | 79 | [ -x ${SHLOCK:Q}"" ] || { \ |
80 | ${ERROR_MSG} "[locking.mk] shlock is not installed."; \ | | 80 | ${ERROR_MSG} "[locking.mk] shlock is not installed."; \ |
81 | ${ERROR_MSG} "[locking.mk] Please \"(cd ../../pkgtools/shlock && ${MAKE} install)\"."; \ | | 81 | ${ERROR_MSG} "[locking.mk] Please \"(cd ../../pkgtools/shlock && ${MAKE} install)\"."; \ |
82 | exit 1; \ | | 82 | exit 1; \ |
83 | } | | 83 | } |
84 | | | 84 | |
85 | _ACQUIRE_LOCK_CMD= \ | | 85 | _ACQUIRE_LOCK_CMD= \ |
86 | ${_CHECK_IF_SHLOCK_IS_AVAILABLE_CMD}; \ | | 86 | ${_CHECK_IF_SHLOCK_IS_AVAILABLE_CMD}; \ |
87 | ppid=`${PS} -p $$$$ -o ppid | ${AWK} 'NR == 2 { print $$1 }'`; \ | | 87 | ppid=`${PS} -p $$$$ -o ppid | ${AWK} 'NR == 2 { print $$1 }'`; \ |
88 | if [ -z "$$ppid" ]; then \ | | 88 | if [ -z "$$ppid" ]; then \ |
89 | ${ERROR_MSG} "No parent process ID found."; \ | | 89 | ${ERROR_MSG} "No parent process ID found."; \ |
90 | exit 1; \ | | 90 | exit 1; \ |
91 | fi; \ | | 91 | fi; \ |
92 | while :; do \ | | 92 | while :; do \ |
93 | if [ -f /var/run/dmesg.boot -a -f "$$lockfile" ]; then \ | | 93 | if [ -f /var/run/dmesg.boot -a -f "$$lockfile" ]; then \ |
94 | rebooted=`${FIND} /var/run/dmesg.boot -newer "$$lockfile" -print`; \ | | 94 | rebooted=`${FIND} /var/run/dmesg.boot -newer "$$lockfile" -print`; \ |
95 | if [ "$$rebooted" ]; then \ | | 95 | if [ "$$rebooted" ]; then \ |
96 | ${STEP_MSG} "Removing stale $$lockfile"; \ | | 96 | ${STEP_MSG} "Removing stale $$lockfile"; \ |
97 | ${RM} -f "$$lockfile"; \ | | 97 | ${RM} -f "$$lockfile"; \ |
98 | fi; \ | | 98 | fi; \ |
99 | fi; \ | | 99 | fi; \ |
100 | lockdir=`echo "$$lockfile" | sed "s,/[^/]*\$$,,"`; \ | | 100 | lockdir=`echo "$$lockfile" | sed "s,/[^/]*\$$,,"`; \ |
101 | ${MKDIR} "$$lockdir"; \ | | 101 | ${MKDIR} "$$lockdir"; \ |
102 | if ${SHLOCK} -f "$$lockfile" -p "$$ppid"; then \ | | 102 | if ${SHLOCK} -f "$$lockfile" -p "$$ppid"; then \ |
103 | break; \ | | 103 | break; \ |
104 | fi; \ | | 104 | fi; \ |
105 | lockpid=`${CAT} "$$lockfile"`; \ | | 105 | lockpid=`${CAT} "$$lockfile"`; \ |
106 | case "$$locktype" in \ | | 106 | case "$$locktype" in \ |
107 | once) ${FAIL_MSG} "Lock ${.TARGET} is held by pid $$lockpid" ;; \ | | 107 | once) ${FAIL_MSG} "Lock ${.TARGET} is held by pid $$lockpid" ;; \ |
108 | sleep) ${STEP_MSG} "Lock ${.TARGET} is held by pid $$lockpid"; \ | | 108 | sleep) ${STEP_MSG} "Lock ${.TARGET} is held by pid $$lockpid"; \ |
109 | ${SLEEP} ${PKGSRC_SLEEPSECS}; \ | | 109 | ${SLEEP} ${PKGSRC_SLEEPSECS}; \ |
110 | ;; \ | | 110 | ;; \ |
111 | esac; \ | | 111 | esac; \ |
112 | done; | | 112 | done; |
113 | .if defined(PKG_VERBOSE) | | 113 | .if defined(PKG_VERBOSE) |
114 | _ACQUIRE_LOCK_CMD+= \ | | 114 | _ACQUIRE_LOCK_CMD+= \ |
115 | lockpid=`${CAT} "$$lockfile"`; \ | | 115 | lockpid=`${CAT} "$$lockfile"`; \ |
116 | ${STEP_MSG} "Lock $$lockfile acquired for \`\`${.TARGET:S/^acquire-//:S/-lock$//}'' on behalf of process $$lockpid"; | | 116 | ${STEP_MSG} "Lock $$lockfile acquired for \`\`${.TARGET:S/^acquire-//:S/-lock$//}'' on behalf of process $$lockpid"; |
117 | .endif | | 117 | .endif |
118 | | | 118 | |
119 | _RELEASE_LOCK_CMD= # nothing | | 119 | _RELEASE_LOCK_CMD= # nothing |
120 | .if defined(PKG_VERBOSE) | | 120 | .if defined(PKG_VERBOSE) |
121 | _RELEASE_LOCK_CMD+= \ | | 121 | _RELEASE_LOCK_CMD+= \ |
122 | lockpid=`${CAT} "$$lockfile"`; \ | | 122 | lockpid=`${CAT} "$$lockfile"`; \ |
123 | ${STEP_MSG} "Lock $$lockfile released for \`\`${.TARGET:S/^release-//:S/-lock$//}'' on behalf of process $$lockpid"; | | 123 | ${STEP_MSG} "Lock $$lockfile released for \`\`${.TARGET:S/^release-//:S/-lock$//}'' on behalf of process $$lockpid"; |
124 | .endif | | 124 | .endif |
125 | _RELEASE_LOCK_CMD+= \ | | 125 | _RELEASE_LOCK_CMD+= \ |
126 | ${RM} -f "$$lockfile" | | 126 | ${RM} -f "$$lockfile" |
127 | | | 127 | |
128 | # | | 128 | # |
129 | # The targets. | | 129 | # The targets. |
130 | # | | 130 | # |
131 | | | 131 | |
132 | .PHONY: acquire-lock release-lock | | 132 | .PHONY: acquire-lock release-lock |
133 | .PHONY: acquire-localbase-lock release-localbase-lock | | 133 | .PHONY: acquire-localbase-lock release-localbase-lock |
134 | | | 134 | |
135 | .if ${LOCALBASE_LOCKTYPE} == "none" | | 135 | .if ${LOCALBASE_LOCKTYPE} == "none" |
136 | acquire-localbase-lock release-localbase-lock: .USE | | 136 | acquire-localbase-lock release-localbase-lock: .USE |
137 | @${DO_NADA} | | 137 | @${DO_NADA} |
138 | .else | | 138 | .else |
139 | acquire-localbase-lock: .USE | | 139 | acquire-localbase-lock: .USE |
140 | ${RUN} \ | | 140 | ${RUN} \ |
141 | lockfile=${_LOCALBASE_LOCKFILE}; \ | | 141 | lockfile=${_LOCALBASE_LOCKFILE}; \ |
142 | locktype=${LOCALBASE_LOCKTYPE}; \ | | 142 | locktype=${LOCALBASE_LOCKTYPE}; \ |
143 | ${_ACQUIRE_LOCK_CMD} | | 143 | ${_ACQUIRE_LOCK_CMD} |
144 | | | 144 | |
145 | release-localbase-lock: .USE | | 145 | release-localbase-lock: .USE |
146 | ${RUN} \ | | 146 | ${RUN} \ |
147 | lockfile=${_LOCALBASE_LOCKFILE}; \ | | 147 | lockfile=${_LOCALBASE_LOCKFILE}; \ |
148 | locktype=${LOCALBASE_LOCKTYPE}; \ | | 148 | locktype=${LOCALBASE_LOCKTYPE}; \ |
149 | ${_RELEASE_LOCK_CMD} | | 149 | ${_RELEASE_LOCK_CMD} |
150 | .endif | | 150 | .endif |
151 | | | 151 | |
152 | .if ${WRKDIR_LOCKTYPE} == "none" | | 152 | .if ${WRKDIR_LOCKTYPE} == "none" |
153 | acquire-lock release-lock: .USE | | 153 | acquire-lock release-lock: .USE |
154 | @${DO_NADA} | | 154 | @${DO_NADA} |
155 | .else | | 155 | .else |
156 | acquire-lock: .USE | | 156 | acquire-lock: .USE |
157 | ${RUN} \ | | 157 | ${RUN} \ |
158 | lockfile=${_WRKDIR_LOCKFILE}; \ | | 158 | lockfile=${_WRKDIR_LOCKFILE}; \ |
159 | locktype=${WRKDIR_LOCKTYPE}; \ | | 159 | locktype=${WRKDIR_LOCKTYPE}; \ |
160 | ${_ACQUIRE_LOCK_CMD} | | 160 | ${_ACQUIRE_LOCK_CMD} |
161 | | | 161 | |
162 | release-lock: .USE | | 162 | release-lock: .USE |
163 | ${RUN} \ | | 163 | ${RUN} \ |
164 | lockfile=${_WRKDIR_LOCKFILE}; \ | | 164 | lockfile=${_WRKDIR_LOCKFILE}; \ |
165 | locktype=${WRKDIR_LOCKTYPE}; \ | | 165 | locktype=${WRKDIR_LOCKTYPE}; \ |
166 | ${_RELEASE_LOCK_CMD} | | 166 | ${_RELEASE_LOCK_CMD} |
167 | | | 167 | |
168 | .endif | | 168 | .endif |