Description: allow building with make -jN without this there are sporadic segmentation faults . it seems that when gpre opens a database, it clashes with other gpre processes that have the database open. perhaps this is because at this stage of the build the compiled firebird engine lacks ability for synchronisation. So, wrap all engine-using calls with a lock file Author: Damyan Ivanov Forwarded: no --- a/builds/posix/Makefile.in +++ b/builds/posix/Makefile.in @@ -329,8 +329,8 @@ yachts.lnk: metadata.fdb metadata.fdb: $(RUN_ISQL) $(SRC_ROOT)/dbs/metadata.sql -$(RM) $@ - $(RUN_ISQL) -q -i $(SRC_ROOT)/dbs/metadata.sql - $(RUN_GFIX) -mode read_only $@ + $(call LOCK_RUN,$(RUN_ISQL) -q -i $(SRC_ROOT)/dbs/metadata.sql) + $(call LOCK_RUN,$(RUN_GFIX) -mode read_only $@) $(CHMOD) 0444 $@ $(HELP_FDB): help.fdb @@ -339,7 +339,7 @@ $(HELP_FDB): help.fdb $(CHMOD) 0444 $@ help.fdb: $(BLD_ROOT)/misc/help.gbak - $(RUN_GBAK) -MODE read_only -R $< $@ + $(call LOCK_RUN,$(RUN_GBAK) -MODE read_only -R $< $@) $(CHMOD) 0444 $@ $(SECURITY_FDB): security.fdb @@ -349,18 +349,18 @@ $(SECURITY_FDB): security.fdb security.fdb: $(SRC_ROOT)/dbs/security.sql -$(RM) $@ -$(RM) $(SECURITY_TMP) - echo create database \'$(SECURITY_TMP)\'\; | $(RUN_ISQL) - $(RUN_GFIX) -write async $(SECURITY_TMP) - $(RUN_ISQL) -i $^ $(SECURITY_TMP) + $(call LOCK_RUN,echo create database \'$(SECURITY_TMP)\'\; | $(RUN_ISQL)) + $(call LOCK_RUN,$(RUN_GFIX) -write async $(SECURITY_TMP)) + $(call LOCK_RUN,$(RUN_ISQL) -i $^ $(SECURITY_TMP)) $(CHMOD) a=rw $(SECURITY_TMP) $(CP) $(SECURITY_TMP) $@ - $(RUN_GFIX) -write sync $@ + $(call LOCK_RUN,$(RUN_GFIX) -write sync $@) msg.timestamp: $(MSG_FILES) -$(RM) msg.fdb - echo create database \'msg.fdb\'\; | $(RUN_ISQL) - $(RUN_GFIX) -write async msg.fdb - for sql in $(MSG_FILES); do (echo $$sql; $(RUN_ISQL) -i $$sql msg.fdb) || exit; done + $(call LOCK_RUN,echo create database \'msg.fdb\'\; | $(RUN_ISQL)) + $(call LOCK_RUN,$(RUN_GFIX) -write async msg.fdb) + $(call LOCK_RUN,for sql in $(MSG_FILES); do (echo $$sql; $(RUN_ISQL) -i $$sql msg.fdb) || exit; done) $(TOUCH) $@ @@ -528,7 +528,7 @@ codes: gen_codes ids: $(IDS) gen_codes: $(CODES) msg.timestamp - $(CODES) $(SRC_ROOT)/include/gen $(LNG_ROOT) + $(call LOCK_RUN,$(CODES) $(SRC_ROOT)/include/gen $(LNG_ROOT)) $(CODES): $(CODES_Objects) $(COMMON_LIB) $(EXE_LINK) $(EXE_LINK_OPTIONS) $^ -o $@ $(FIREBIRD_LIBRARY_LINK) $(LINK_LIBS) @@ -564,7 +564,7 @@ examples: include_generic message_file: $(FIREBIRD_MSG) $(FIREBIRD_MSG): $(BUILD_FILE) msg.timestamp - $(BUILD_FILE) -d msg.fdb -f $@ + $(call LOCK_RUN,$(BUILD_FILE) -d msg.fdb -f $@) $(CHMOD_6) $@ $(BUILD_FILE): $(BUILD_Objects) $(COMMON_LIB) --- a/builds/posix/make.defaults +++ b/builds/posix/make.defaults @@ -378,6 +378,7 @@ GPRE_BOOT = $(RBIN)/gpre_boot$(EXE GPRE = $(BIN)/gpre$(EXEC_EXT) RUN_GPRE = $(RBIN)/gpre$(EXEC_EXT) GPRE_CURRENT = $(RBIN)/gpre_current$(EXEC_EXT) +LOCK_RUN = sh -x -c "lockfile -1 $(BIN)/build-db.lock && $(subst $$,\$$,$(1)); res=\$$?; rm -f $(BIN)/build-db.lock; exit \$$res" # From msgs --- a/builds/posix/make.rules +++ b/builds/posix/make.rules @@ -72,17 +72,17 @@ ISQL_GPRE_FLAGS = -m -z -n -ocxx .SUFFIXES: .c .e .epp .cpp .e.c: - $(GPRE_CURRENT) $(GPRE_FLAGS) $< $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(GPRE_FLAGS) $< $@) $(OBJ)/jrd/%.cpp: $(SRC_ROOT)/jrd/%.epp - $(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $(firstword $<) $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $(firstword $<) $@) $(OBJ)/isql/%.cpp: $(SRC_ROOT)/isql/%.epp - $(GPRE_CURRENT) $(ISQL_GPRE_FLAGS) $< $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(ISQL_GPRE_FLAGS) $< $@) $(OBJ)/%.cpp: $(SRC_ROOT)/%.epp - $(GPRE_CURRENT) $(GPRE_FLAGS) $(firstword $<) $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(GPRE_FLAGS) $(firstword $<) $@) .SUFFIXES: .lo .o .cpp .c --- a/builds/posix/make.shared.targets +++ b/builds/posix/make.shared.targets @@ -65,13 +65,13 @@ $(OBJ)/dsql/Parser.o $(OBJ)/yvalve/keywo # Special cases for building cpp from epp $(OBJ)/dsql/metd.cpp: $(SRC_ROOT)/dsql/metd.epp - $(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@) $(OBJ)/dsql/DdlNodes.cpp: $(SRC_ROOT)/dsql/DdlNodes.epp - $(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@) $(OBJ)/dsql/PackageNodes.cpp: $(SRC_ROOT)/dsql/PackageNodes.epp - $(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@ + $(call LOCK_RUN,$(GPRE_CURRENT) $(JRD_GPRE_FLAGS) $< $@) # Adding resources as prerequisite for some files --- a/builds/posix/Makefile.in.examples +++ b/builds/posix/Makefile.in.examples @@ -123,8 +123,8 @@ $(EXAMPLES_DEST)% : $(EXAMPLES_SRC)% $(EMPLOYEE_DB): $(EXAMPLES_DEST)/empbuild$(EXEC_EXT) $(INPUT_Sources) $(EXAMPLES_DEST)/isql$(EXEC_EXT) -$(RM) $(EMPLOYEE_DB) - ./empbuild $(EMPLOYEE_DB) - $(GFIX) -write sync $(EMPLOYEE_DB) + $(call LOCK_RUN,./empbuild $(EMPLOYEE_DB)) + $(call LOCK_RUN,$(GFIX) -write sync $(EMPLOYEE_DB)) -$(CHMOD_6) $(EMPLOYEE_DB) # To get past the fact isql is called from the programs, we create a local link in this directory @@ -140,7 +140,7 @@ $(EXAMPLES_DEST)/empbuild.c: $(EXAMPLES_ $(EXAMPLES_DEST)/empbuild.fdb : $(EXAMPLES_DEST)/empddl.sql $(EXAMPLES_DEST)/empbld.sql $(EXAMPLES_DEST)/isql$(EXEC_EXT) -$(RM) $(EXAMPLES_DEST)/empbuild.fdb - $(EXAMPLES_DEST)/isql$(EXEC_EXT) -i empbld.sql + $(call LOCK_RUN,$(EXAMPLES_DEST)/isql$(EXEC_EXT) -i empbld.sql) # The chain for intlemp.fdb is the same a script file to create an empty database # to allow a .e program to be compiled, to then create and populate with data @@ -148,7 +148,7 @@ $(EXAMPLES_DEST)/empbuild.fdb : $(EXAMPL $(EXAMPLES_DEST)/intlemp.fdb: $(EXAMPLES_DEST)/intlbld$(EXEC_EXT) $(INTL_Sources) $(EXAMPLES_DEST)/isql$(EXEC_EXT) -$(RM) intlemp.fdb - ./intlbld intlemp.fdb + $(call LOCK_RUN,./intlbld intlemp.fdb) -$(CHMOD_6) intlemp.fdb $(EXAMPLES_DEST)/intlbld$(EXEC_EXT): $(INTLBLD_Objects) $(COMMON_LIB) @@ -158,7 +158,7 @@ $(EXAMPLES_DEST)/intlbld.c: $(EXAMPLES_D $(EXAMPLES_DEST)/intlbuild.fdb : $(EXAMPLES_DEST)/intlddl.sql $(EXAMPLES_DEST)/intlbld.sql $(EXAMPLES_DEST)/isql$(EXEC_EXT) -$(RM) intlbuild.fdb - $(EXAMPLES_DEST)/isql$(EXEC_EXT) -i intlbld.sql + $(call LOCK_RUN,$(EXAMPLES_DEST)/isql$(EXEC_EXT) -i intlbld.sql) $(EXAMPLES_DEST)/%.sql: $(EXAMPLES_SRC)/empbuild/%.sql