Merge "Rename libnanopb-c-2.8.0 to libprotobuf-c-nano."
diff --git a/core/Makefile b/core/Makefile
index 73d6e4b..2f75568 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -114,7 +114,7 @@
ifneq ($(filter eng.%,$(BUILD_NUMBER)),)
# Trim down BUILD_FINGERPRINT: the default BUILD_NUMBER makes it easily exceed
# the Android system property length limit (PROPERTY_VALUE_MAX=92).
- BF_BUILD_NUMBER := $(USER)$(shell date +%m%d%H%M)
+ BF_BUILD_NUMBER := $(USER)$(shell $(DATE) +%m%d%H%M)
else
BF_BUILD_NUMBER := $(BUILD_NUMBER)
endif
@@ -197,6 +197,7 @@
PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" \
BUILD_ID="$(BUILD_ID)" \
BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \
+ DATE="$(DATE_FROM_FILE)" \
BUILD_NUMBER="$(BUILD_NUMBER_FROM_FILE)" \
BOARD_BUILD_SYSTEM_ROOT_IMAGE="$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)" \
PLATFORM_VERSION="$(PLATFORM_VERSION)" \
@@ -246,8 +247,8 @@
@echo Target vendor buildinfo: $@
@mkdir -p $(dir $@)
$(hide) echo > $@
- $(hide) echo ro.vendor.build.date=`date`>>$@
- $(hide) echo ro.vendor.build.date.utc=`date +%s`>>$@
+ $(hide) echo ro.vendor.build.date=`$(DATE_FROM_FILE)`>>$@
+ $(hide) echo ro.vendor.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@
$(hide) echo ro.vendor.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
endif
@@ -262,8 +263,8 @@
@echo Target bootimage buildinfo: $@
@mkdir -p $(dir $@)
$(hide) echo > $@
- $(hide) echo ro.bootimage.build.date=`date`>>$@
- $(hide) echo ro.bootimage.build.date.utc=`date +%s`>>$@
+ $(hide) echo ro.bootimage.build.date=`$(DATE_FROM_FILE)`>>$@
+ $(hide) echo ro.bootimage.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@
$(hide) echo ro.bootimage.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
# -----------------------------------------------------------------
diff --git a/core/combo/HOST_windows-x86.mk b/core/combo/HOST_windows-x86.mk
index 5839e73..eb1c49c 100644
--- a/core/combo/HOST_windows-x86.mk
+++ b/core/combo/HOST_windows-x86.mk
@@ -14,19 +14,10 @@
# limitations under the License.
#
-# Configuration for Linux on x86.
+# Settings to use MinGW as a cross-compiler under Linux
# Included by combo/select.make
-# right now we get these from the environment, but we should
-# pick them from the tree somewhere
-TOOLS_PREFIX := #prebuilt/windows/host/bin/
-TOOLS_EXE_SUFFIX := .exe
-
-# Settings to use MinGW has a cross-compiler under Linux
-ifneq ($(findstring Linux,$(UNAME)),)
-ifdef USE_MINGW
HOST_ACP_UNAVAILABLE := true
-TOOLS_EXE_SUFFIX :=
$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -DUSE_MINGW -DWIN32_LEAN_AND_MEAN
$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -Wno-unused-parameter
$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += --sysroot=prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32
@@ -36,8 +27,6 @@
$(combo_2nd_arch_prefix)HOST_C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/include
$(combo_2nd_arch_prefix)HOST_C_INCLUDES += prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/lib/gcc/x86_64-w64-mingw32/4.8.3/include
$(combo_2nd_arch_prefix)HOST_GLOBAL_LD_DIRS += -Lprebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/x86_64-w64-mingw32/lib32
-endif # USE_MINGW
-endif # Linux
# Workaround differences in inttypes.h between host and target.
# See bug 12708004.
@@ -59,22 +48,6 @@
$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -static
endif # BUILD_HOST_static
-# when building under Cygwin, ensure that we use Mingw compilation by default.
-# you can disable this (i.e. to generate Cygwin executables) by defining the
-# USE_CYGWIN variable in your environment, e.g.:
-#
-# export USE_CYGWIN=1
-#
-# note that the -mno-cygwin flags are not needed when cross-compiling the
-# Windows host tools on Linux
-#
-ifneq ($(findstring CYGWIN,$(UNAME)),)
-ifeq ($(strip $(USE_CYGWIN)),)
-$(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -mno-cygwin
-$(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -mno-cygwin -mconsole
-endif
-endif
-
############################################################
## Macros after this line are shared by the 64-bit config.
@@ -82,7 +55,6 @@
HOST_EXECUTABLE_SUFFIX := .exe
# $(1): The file to check
-# TODO: find out what format cygwin's stat(1) uses
define get-file-size
-999999999
+stat --format "%s" "$(1)" | tr -d '\n'
endef
diff --git a/core/combo/HOST_windows-x86_64.mk b/core/combo/HOST_windows-x86_64.mk
index c526f20..b38c74c 100644
--- a/core/combo/HOST_windows-x86_64.mk
+++ b/core/combo/HOST_windows-x86_64.mk
@@ -14,25 +14,17 @@
# limitations under the License.
#
-# Configuration for Windows on x86_64.
+# Settings to use MinGW as a cross-compiler under Linux
# Included by combo/select.make
# right now we get these from the environment, but we should
# pick them from the tree somewhere
-TOOLS_PREFIX := #prebuilt/windows/host/bin/
-TOOLS_EXE_SUFFIX := .exe
-
-# Settings to use MinGW has a cross-compiler under Linux
-ifneq ($(findstring Linux,$(UNAME)),)
-ifdef USE_MINGW
-HOST_ACP_UNAVAILABLE := true
-TOOLS_EXE_SUFFIX :=
-HOST_GLOBAL_CFLAGS += -DUSE_MINGW
TOOLS_PREFIX := /usr/bin/amd64-mingw32msvc-
+
+HOST_ACP_UNAVAILABLE := true
+HOST_GLOBAL_CFLAGS += -DUSE_MINGW
HOST_C_INCLUDES += /usr/lib/gcc/amd64-mingw32msvc/4.4.2/include
HOST_GLOBAL_LD_DIRS += -L/usr/amd64-mingw32msvc/lib
-endif # USE_MINGW
-endif # Linux
# Workaround differences in inttypes.h between host and target.
# See bug 12708004.
@@ -50,19 +42,3 @@
# Statically-linked binaries are desirable for sandboxed environment
HOST_GLOBAL_LDFLAGS += -static
endif # BUILD_HOST_static
-
-# when building under Cygwin, ensure that we use Mingw compilation by default.
-# you can disable this (i.e. to generate Cygwin executables) by defining the
-# USE_CYGWIN variable in your environment, e.g.:
-#
-# export USE_CYGWIN=1
-#
-# note that the -mno-cygwin flags are not needed when cross-compiling the
-# Windows host tools on Linux
-#
-ifneq ($(findstring CYGWIN,$(UNAME)),)
-ifeq ($(strip $(USE_CYGWIN)),)
-HOST_GLOBAL_CFLAGS += -mno-cygwin
-HOST_GLOBAL_LDFLAGS += -mno-cygwin -mconsole
-endif
-endif
diff --git a/core/combo/javac.mk b/core/combo/javac.mk
index fb43ea4..e3838a6 100644
--- a/core/combo/javac.mk
+++ b/core/combo/javac.mk
@@ -26,12 +26,7 @@
endif
# Whatever compiler is on this system.
-ifeq ($(BUILD_OS), windows)
- COMMON_JAVAC := development/host/windows/prebuilt/javawrap.exe -J-Xmx256m \
- $(common_jdk_flags)
-else
- COMMON_JAVAC := $(JAVACC) -J-Xmx1024M $(common_jdk_flags)
-endif
+COMMON_JAVAC := $(JAVACC) -J-Xmx1024M $(common_jdk_flags)
# Eclipse.
ifeq ($(CUSTOM_JAVA_COMPILER), eclipse)
diff --git a/core/config.mk b/core/config.mk
index fea3d4b..78a43ec 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -163,6 +163,23 @@
# are specific to the user's build configuration.
include $(BUILD_SYSTEM)/envsetup.mk
+# ---------------------------------------------------------------
+# Allow the C/C++ macros __DATE__ and __TIME__ to be set to the
+# build date and time, so that a build may be repeated.
+# Write the date and time to a file so that the command line
+# doesn't change every time, which would cause ninja to rebuild
+# the files.
+$(shell mkdir -p $(OUT_DIR) && \
+ $(DATE) "+%b %_d %Y" > $(OUT_DIR)/build_c_date.txt && \
+ $(DATE) +%T > $(OUT_DIR)/build_c_time.txt)
+BUILD_DATETIME_C_DATE := $$(cat $(OUT_DIR)/build_c_date.txt)
+BUILD_DATETIME_C_TIME := $$(cat $(OUT_DIR)/build_c_time.txt)
+
+ifeq ($(OVERRIDE_C_DATE_TIME),true)
+COMMON_GLOBAL_CFLAGS += -Wno-builtin-macro-redefined -D__DATE__="\"$(BUILD_DATETIME_C_DATE)\"" -D__TIME__=\"$(BUILD_DATETIME_C_TIME)\"
+COMMON_GLOBAL_CPPFLAGS += -Wno-builtin-macro-redefined -D__DATE__="\"$(BUILD_DATETIME_C_DATE)\"" -D__TIME__=\"$(BUILD_DATETIME_C_TIME)\"
+endif
+
# The build system exposes several variables for where to find the kernel
# headers:
# TARGET_DEVICE_KERNEL_HEADERS is automatically created for the current
@@ -495,12 +512,7 @@
YACC_HEADER_SUFFIX:= .hpp
-# Don't use column under Windows, cygwin or not
-ifeq ($(HOST_OS),windows)
-COLUMN:= cat
-else
COLUMN:= column
-endif
HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh)
diff --git a/core/definitions.mk b/core/definitions.mk
index d05a596..dd84b8a 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -1645,11 +1645,7 @@
$(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR))
endef
-ifeq ($(HOST_OS),windows)
-xlint_unchecked :=
-else
xlint_unchecked := -Xlint:unchecked
-endif
ifeq (true, $(ENABLE_INCREMENTALJAVAC))
incremental_dex := --incremental
@@ -1988,13 +1984,12 @@
#TODO: use a smaller -Xmx value for most libraries;
# only core.jar and framework.jar need a heap this big.
-# Avoid the memory arguments on Windows, dx fails to load for some reason with them.
define transform-classes.jar-to-dex
@echo "target Dex: $(PRIVATE_MODULE)"
@mkdir -p $(dir $@)
$(hide) rm -f $(dir $@)classes*.dex
$(hide) $(DX) \
- $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \
+ -JXms16M -JXmx2048M \
--dex --output=$(dir $@) \
$(incremental_dex) \
$(if $(NO_OPTIMIZE_DX), \
diff --git a/core/droiddoc.mk b/core/droiddoc.mk
index 417d4fd..aae2aba 100644
--- a/core/droiddoc.mk
+++ b/core/droiddoc.mk
@@ -132,7 +132,7 @@
$(full_target): PRIVATE_DOCLETPATH := $(HOST_OUT_JAVA_LIBRARIES)/jsilver$(COMMON_JAVA_PACKAGE_SUFFIX):$(HOST_OUT_JAVA_LIBRARIES)/doclava$(COMMON_JAVA_PACKAGE_SUFFIX)
$(full_target): PRIVATE_CURRENT_BUILD := -hdf page.build $(BUILD_ID)-$(BUILD_NUMBER_FROM_FILE)
-$(full_target): PRIVATE_CURRENT_TIME := -hdf page.now "$$(date "+%d %b %Y %k:%M")"
+$(full_target): PRIVATE_CURRENT_TIME := -hdf page.now "$$($(DATE_FROM_FILE) "+%d %b %Y %k:%M")"
$(full_target): PRIVATE_CUSTOM_TEMPLATE_DIR := $(LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR)
$(full_target): PRIVATE_IN_CUSTOM_ASSET_DIR := $(LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR)/$(LOCAL_DROIDDOC_CUSTOM_ASSET_DIR)
$(full_target): PRIVATE_OUT_ASSET_DIR := $(out_dir)/$(LOCAL_DROIDDOC_ASSET_DIR)
diff --git a/core/envsetup.mk b/core/envsetup.mk
index 0b68152..c76e9a6 100644
--- a/core/envsetup.mk
+++ b/core/envsetup.mk
@@ -48,9 +48,6 @@
ifneq (,$(findstring Macintosh,$(UNAME)))
HOST_OS := darwin
endif
-ifneq (,$(findstring CYGWIN,$(UNAME)))
- HOST_OS := windows
-endif
# BUILD_OS is the real host doing the build.
BUILD_OS := $(HOST_OS)
diff --git a/core/main.mk b/core/main.mk
index b290ce1..3c5a554 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -38,8 +38,6 @@
#endif
# Check for broken versions of make.
-# (Allow any version under Cygwin since we don't actually build the platform there.)
-ifeq (,$(findstring CYGWIN,$(shell uname -sm)))
ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \>= 3.81)))
$(warning ********************************************************************************)
$(warning * You are using version $(MAKE_VERSION) of make.)
@@ -48,7 +46,6 @@
$(warning ********************************************************************************)
$(error stopping)
endif
-endif
# Absolute path of the present working direcotry.
# This overrides the shell variable $PWD, which does not necessarily points to
@@ -102,8 +99,16 @@
# Write the build number to a file so it can be read back in
# without changing the command line every time. Avoids rebuilds
# when using ninja.
-$(shell mkdir -p $(OUT_DIR) && echo -n $(BUILD_NUMBER) > $(OUT_DIR)/build_number.txt)
+$(shell mkdir -p $(OUT_DIR) && \
+ echo -n $(BUILD_NUMBER) > $(OUT_DIR)/build_number.txt && \
+ echo -n $(BUILD_DATETIME) > $(OUT_DIR)/build_date.txt)
BUILD_NUMBER_FROM_FILE := $$(cat $(OUT_DIR)/build_number.txt)
+BUILD_DATETIME_FROM_FILE := $$(cat $(OUT_DIR)/build_date.txt)
+ifeq ($(HOST_OS),darwin)
+DATE_FROM_FILE := date -r $(BUILD_DATETIME_FROM_FILE)
+else
+DATE_FROM_FILE := date -d @$(BUILD_DATETIME_FROM_FILE)
+endif
# CTS-specific config.
-include cts/build/config.mk
@@ -123,7 +128,6 @@
$(info Checking build tools versions...)
-ifneq ($(HOST_OS),windows)
# check for a case sensitive file system
ifneq (a,$(shell mkdir -p $(OUT_DIR) ; \
echo a > $(OUT_DIR)/casecheck.txt; \
@@ -135,7 +139,6 @@
$(warning ************************************************************)
$(error Case-insensitive filesystems not supported)
endif
-endif
# Make sure that there are no spaces in the absolute path; the
# build system can't deal with them.
@@ -471,11 +474,6 @@
include $(TOPDIR)sdk/build/windows_sdk_whitelist.mk
include $(TOPDIR)development/build/windows_sdk_whitelist.mk
-# Exclude tools/acp when cross-compiling windows under linux
-ifeq ($(findstring Linux,$(UNAME)),)
-subdirs += build/tools/acp
-endif
-
else # !SDK_ONLY
#
# Typical build; include any Android.mk files we can find.
diff --git a/core/version_defaults.mk b/core/version_defaults.mk
index f3b2297..170e20b 100644
--- a/core/version_defaults.mk
+++ b/core/version_defaults.mk
@@ -24,6 +24,7 @@
# DEFAULT_APP_TARGET_SDK
# BUILD_ID
# BUILD_NUMBER
+# BUILD_DATETIME
#
# Look for an optional file containing overrides of the defaults,
@@ -89,6 +90,18 @@
BUILD_ID := UNKNOWN
endif
+ifeq "" "$(BUILD_DATETIME)"
+ # Used to reproduce builds by setting the same time. Must be the number
+ # of seconds since the Epoch.
+ BUILD_DATETIME := $(shell date +%s)
+endif
+
+ifneq (,$(findstring Darwin,$(shell uname -sm)))
+DATE := date -r $(BUILD_DATETIME)
+else
+DATE := date -d @$(BUILD_DATETIME)
+endif
+
ifeq "" "$(BUILD_NUMBER)"
# BUILD_NUMBER should be set to the source control value that
# represents the current state of the source code. E.g., a
@@ -99,5 +112,5 @@
# If no BUILD_NUMBER is set, create a useful "I am an engineering build
# from this date/time" value. Make it start with a non-digit so that
# anyone trying to parse it as an integer will probably get "0".
- BUILD_NUMBER := eng.$(USER).$(shell date +%Y%m%d.%H%M%S)
+ BUILD_NUMBER := eng.$(USER).$(shell $(DATE) +%Y%m%d.%H%M%S)
endif
diff --git a/libs/host/Android.mk b/libs/host/Android.mk
index d1d2e55..821f9b8 100644
--- a/libs/host/Android.mk
+++ b/libs/host/Android.mk
@@ -5,9 +5,6 @@
LOCAL_SRC_FILES:= \
CopyFile.c
-ifeq ($(HOST_OS),cygwin)
-LOCAL_CFLAGS += -DWIN32_EXE
-endif
ifeq ($(HOST_OS),darwin)
LOCAL_CFLAGS += -DMACOSX_RSRC
endif
diff --git a/libs/host/CopyFile.c b/libs/host/CopyFile.c
index dfa9426..b2a3e7f 100644
--- a/libs/host/CopyFile.c
+++ b/libs/host/CopyFile.c
@@ -543,57 +543,6 @@
statResult = stat(src, &srcStat);
statErrno = errno; /* preserve across .exe attempt */
-#ifdef WIN32_EXE
- /*
- * Here's the interesting part. Under Cygwin, if you have a file
- * called "foo.exe", stat("foo", ...) will succeed, but open("foo", ...)
- * will fail. We need to figure out what its name is supposed to be
- * so we can create the correct destination file.
- *
- * If we don't have the "-e" flag set, we want "acp foo bar" to fail,
- * not automatically find "foo.exe". That way, if we really were
- * trying to copy "foo", it doesn't grab something we don't want.
- */
- if (isCmdLine && statResult == 0) {
- int tmpFd;
- tmpFd = open(src, O_RDONLY | O_BINARY, 0);
- if (tmpFd < 0) {
- statResult = -1;
- statErrno = ENOENT;
- } else {
- (void) close(tmpFd);
- }
- }
-
- /*
- * If we didn't find the file, try it again with ".exe".
- */
- if (isCmdLine && statResult < 0 && statErrno == ENOENT && (options & COPY_TRY_EXE)) {
- srcExe = malloc(strlen(src) + 4 +1);
- strcpy(srcExe, src);
- strcat(srcExe, ".exe");
-
- if (options & COPY_NO_DEREFERENCE)
- statResult = lstat(srcExe, &srcStat);
- else
- statResult = stat(srcExe, &srcStat);
-
- if (statResult == 0 && !S_ISREG(srcStat.st_mode))
- statResult = -1; /* fail, use original statErrno below */
-
- if (statResult == 0) {
- /* found a .exe, copy that instead */
- dstExe = malloc(strlen(dst) + 4 +1);
- strcpy(dstExe, dst);
- strcat(dstExe, ".exe");
-
- src = srcExe;
- dst = dstExe;
- } else {
- DBUG(("--- couldn't find '%s' either\n", srcExe));
- }
- }
-#endif
if (statResult < 0) {
if (statErrno == ENOENT)
fprintf(stderr, "acp: file '%s' does not exist\n", src);
diff --git a/tools/acp/Android.mk b/tools/acp/Android.mk
index fbdb797..e31ad3a 100644
--- a/tools/acp/Android.mk
+++ b/tools/acp/Android.mk
@@ -9,9 +9,6 @@
LOCAL_SRC_FILES := \
acp.c
-ifeq ($(HOST_OS),cygwin)
-LOCAL_CFLAGS += -DWIN32_EXE
-endif
ifeq ($(HOST_OS),darwin)
LOCAL_CFLAGS += -DMACOSX_RSRC
endif
diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh
index 1fb203a..910894d 100755
--- a/tools/buildinfo.sh
+++ b/tools/buildinfo.sh
@@ -10,8 +10,8 @@
echo "ro.build.version.codename=$PLATFORM_VERSION_CODENAME"
echo "ro.build.version.all_codenames=$PLATFORM_VERSION_ALL_CODENAMES"
echo "ro.build.version.release=$PLATFORM_VERSION"
-echo "ro.build.date=`date`"
-echo "ro.build.date.utc=`date +%s`"
+echo "ro.build.date=`$DATE`"
+echo "ro.build.date.utc=`$DATE +%s`"
echo "ro.build.type=$TARGET_BUILD_TYPE"
echo "ro.build.user=$USER"
echo "ro.build.host=`hostname`"
diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
index e042e03..199783d 100644
--- a/tools/releasetools/blockimgdiff.py
+++ b/tools/releasetools/blockimgdiff.py
@@ -174,6 +174,12 @@
return (sum(sr.size() for (_, sr) in self.stash_before) -
sum(sr.size() for (_, sr) in self.use_stash))
+ def ConvertToNew(self):
+ assert self.style != "new"
+ self.use_stash = []
+ self.style = "new"
+ self.src_ranges = RangeSet()
+
def __str__(self):
return (str(self.id) + ": <" + str(self.src_ranges) + " " + self.style +
" to " + str(self.tgt_ranges) + ">")
@@ -268,6 +274,10 @@
self.ReverseBackwardEdges()
self.ImproveVertexSequence()
+ # Ensure the runtime stash size is under the limit.
+ if self.version >= 2 and common.OPTIONS.cache_size is not None:
+ self.ReviseStashSize()
+
# Double-check our work.
self.AssertSequenceGood()
@@ -519,6 +529,73 @@
print("max stashed blocks: %d (%d bytes), limit: <unknown>\n" % (
max_stashed_blocks, max_stashed_size))
+ def ReviseStashSize(self):
+ print("Revising stash size...")
+ stashes = {}
+
+ # Create the map between a stash and its def/use points. For example, for a
+ # given stash of (idx, sr), stashes[idx] = (sr, def_cmd, use_cmd).
+ for xf in self.transfers:
+ # Command xf defines (stores) all the stashes in stash_before.
+ for idx, sr in xf.stash_before:
+ stashes[idx] = (sr, xf)
+
+ # Record all the stashes command xf uses.
+ for idx, _ in xf.use_stash:
+ stashes[idx] += (xf,)
+
+ # Compute the maximum blocks available for stash based on /cache size and
+ # the threshold.
+ cache_size = common.OPTIONS.cache_size
+ stash_threshold = common.OPTIONS.stash_threshold
+ max_allowed = cache_size * stash_threshold / self.tgt.blocksize
+
+ stashed_blocks = 0
+
+ # Now go through all the commands. Compute the required stash size on the
+ # fly. If a command requires excess stash than available, it deletes the
+ # stash by replacing the command that uses the stash with a "new" command
+ # instead.
+ for xf in self.transfers:
+ replaced_cmds = []
+
+ # xf.stash_before generates explicit stash commands.
+ for idx, sr in xf.stash_before:
+ if stashed_blocks + sr.size() > max_allowed:
+ # We cannot stash this one for a later command. Find out the command
+ # that will use this stash and replace the command with "new".
+ use_cmd = stashes[idx][2]
+ replaced_cmds.append(use_cmd)
+ print(" %s replaced due to an explicit stash of %d blocks." % (
+ use_cmd, sr.size()))
+ else:
+ stashed_blocks += sr.size()
+
+ # xf.use_stash generates free commands.
+ for _, sr in xf.use_stash:
+ stashed_blocks -= sr.size()
+
+ # "move" and "diff" may introduce implicit stashes in BBOTA v3. Prior to
+ # ComputePatches(), they both have the style of "diff".
+ if xf.style == "diff" and self.version >= 3:
+ assert xf.tgt_ranges and xf.src_ranges
+ if xf.src_ranges.overlaps(xf.tgt_ranges):
+ if stashed_blocks + xf.src_ranges.size() > max_allowed:
+ replaced_cmds.append(xf)
+ print(" %s replaced due to an implicit stash of %d blocks." % (
+ xf, xf.src_ranges.size()))
+
+ # Replace the commands in replaced_cmds with "new"s.
+ for cmd in replaced_cmds:
+ # It no longer uses any commands in "use_stash". Remove the def points
+ # for all those stashes.
+ for idx, sr in cmd.use_stash:
+ def_cmd = stashes[idx][1]
+ assert (idx, sr) in def_cmd.stash_before
+ def_cmd.stash_before.remove((idx, sr))
+
+ cmd.ConvertToNew()
+
def ComputePatches(self, prefix):
print("Reticulating splines...")
diff_q = []