File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 7272
7373echo " Downloading P4 API SDK for $OS /$ARCH ..."
7474TMPDIR=" $( mktemp -d) "
75- trap ' rm -rf "$TMPDIR"' EXIT
75+ INCLUDE_LOCK=" ${P4API_DIR} /.include.lock"
76+ mkdir -p " $P4API_DIR "
77+ cleanup () {
78+ rm -rf " $TMPDIR "
79+ rmdir " $INCLUDE_LOCK " 2> /dev/null || true
80+ }
81+ trap cleanup EXIT
7682
7783if [[ " $ARCHIVE_TYPE " == " tgz" ]]; then
7884 curl -sL " $URL " -o " $TMPDIR /p4api.tgz"
9298mkdir -p " $LIB_DIR "
9399cp " $EXTRACTED " /lib/* .a " $LIB_DIR /"
94100
95- # Update shared include directory to match the downloaded SDK variant
96- rm -rf " $P4API_DIR /include"
97- cp -r " $EXTRACTED /include" " $P4API_DIR /include"
101+ # Update shared include directory to match the downloaded SDK variant.
102+ # Multiple arch builds may run in parallel and share $P4API_DIR/include,
103+ # so serialize the rm+cp with an atomic mkdir lock and a version sentinel.
104+ SENTINEL=" $P4API_DIR /include/.p4api-version"
105+ for _ in $( seq 1 120) ; do
106+ if mkdir " $INCLUDE_LOCK " 2> /dev/null; then
107+ break
108+ fi
109+ sleep 1
110+ done
111+ if [[ ! -f " $SENTINEL " ]] || [[ " $( cat " $SENTINEL " 2> /dev/null) " != " $P4API_VERSION " ]]; then
112+ rm -rf " $P4API_DIR /include"
113+ cp -r " $EXTRACTED /include" " $P4API_DIR /include"
114+ echo " $P4API_VERSION " > " $SENTINEL "
115+ fi
116+ rmdir " $INCLUDE_LOCK " 2> /dev/null || true
98117
99118echo " Installed P4 API libs to $LIB_DIR ($( ls " $LIB_DIR " /* .a | wc -l | tr -d ' ' ) files)"
You can’t perform that action at this time.
0 commit comments