[oe-commits] Tobias Henkel : icecc: Fix race condition when packaging toolchain
git at git.openembedded.org
git at git.openembedded.org
Tue Nov 12 16:09:28 UTC 2013
Module: openembedded-core.git
Branch: master
Commit: 8a30be803e91e66688cfc27ca4c21f26fb22eed8
URL: http://git.openembedded.org/?p=openembedded-core.git&a=commit;h=8a30be803e91e66688cfc27ca4c21f26fb22eed8
Author: Tobias Henkel <tobias.henkel at bmw-carit.de>
Date: Tue Nov 12 09:34:03 2013 +0100
icecc: Fix race condition when packaging toolchain
In the current implementation there can be a race condition while
creating the toolchain archive causing the build to break.
This is fixed by locking the toolchain archiving step using flock.
Signed-off-by: Tobias Henkel <tobias.henkel at bmw-carit.de>
Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
meta/classes/icecc.bbclass | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/meta/classes/icecc.bbclass b/meta/classes/icecc.bbclass
index 3255839..1f53f85 100644
--- a/meta/classes/icecc.bbclass
+++ b/meta/classes/icecc.bbclass
@@ -202,6 +202,21 @@ def icc_get_and_check_tool(bb, d, tool):
else:
return t
+wait_for_file() {
+ local TIME_ELAPSED=0
+ local FILE_TO_TEST=$1
+ local TIMEOUT=$2
+ until [ -f "$FILE_TO_TEST" ]
+ do
+ TIME_ELAPSED=`expr $TIME_ELAPSED + 1`
+ if [ $TIME_ELAPSED -gt $TIMEOUT ]
+ then
+ return 1
+ fi
+ sleep 1
+ done
+}
+
def set_icecc_env():
# dummy python version of set_icecc_env
return
@@ -247,10 +262,22 @@ set_icecc_env() {
ICECC_AS="`which as`"
fi
- if [ ! -r "${ICECC_VERSION}" ]
+ if [ ! -f "${ICECC_VERSION}.done" ]
then
mkdir -p "`dirname "${ICECC_VERSION}"`"
- ${ICECC_ENV_EXEC} "${ICECC_CC}" "${ICECC_CXX}" "${ICECC_AS}" "${ICECC_VERSION}"
+
+ # the ICECC_VERSION generation step must be locked by a mutex
+ # in order to prevent race conditions
+ if flock -n "${ICECC_VERSION}.lock" \
+ ${ICECC_ENV_EXEC} "${ICECC_CC}" "${ICECC_CXX}" "${ICECC_AS}" "${ICECC_VERSION}"
+ then
+ touch "${ICECC_VERSION}.done"
+ elif [ ! wait_for_file "${ICECC_VERSION}.done" 30 ]
+ then
+ # locking failed so wait for ${ICECC_VERSION}.done to appear
+ bbwarn "Timeout waiting for ${ICECC_VERSION}.done"
+ return
+ fi
fi
export ICECC_VERSION ICECC_CC ICECC_CXX
More information about the Openembedded-commits
mailing list