Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a8714c7 authored by Spandan Das's avatar Spandan Das
Browse files

Do not modify input in-place

SortedUniqueStrings and FirstUniqueStrings dedupes repeating elements
and returns the deduped list. Currently, it also modifies the input list
in-place, which causes non-determinisitc failures like b/275313114

Operate on a copy of the input so that the input remains untouched.

SortedUniqueStrings is O(NlogN) and FirstUniqueStrings is ~O(N), so
creating a copy (O(N)) should not result in major performance regressions.
Numbers for this single unit test:
```
go test . -run TestStubsForLibraryInMultipleApexes -v -count 1000
Before: 174s
After: 172s
```

Test: go test ./android
Test: go test . -run TestStubsForLibraryInMultipleApexes -v -count 1000
Change-Id: Id859723b2c2ebdc0023876c4b6fabe75d870bad7
parent 00bafc66
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -513,9 +513,8 @@ func (m *ApexModuleBase) checkApexAvailableProperty(mctx BaseModuleContext) {
// exactly the same set of APEXes (and platform), i.e. if their apex_available
// properties have the same elements.
func AvailableToSameApexes(mod1, mod2 ApexModule) bool {
	// Use CopyOf to prevent non-determinism (b/275313114#comment1)
	mod1ApexAvail := SortedUniqueStrings(CopyOf(mod1.apexModuleBase().ApexProperties.Apex_available))
	mod2ApexAvail := SortedUniqueStrings(CopyOf(mod2.apexModuleBase().ApexProperties.Apex_available))
	mod1ApexAvail := SortedUniqueStrings(mod1.apexModuleBase().ApexProperties.Apex_available)
	mod2ApexAvail := SortedUniqueStrings(mod2.apexModuleBase().ApexProperties.Apex_available)
	if len(mod1ApexAvail) != len(mod2ApexAvail) {
		return false
	}
+3 −0
Original line number Diff line number Diff line
@@ -276,6 +276,8 @@ func RemoveFromList(s string, list []string) (bool, []string) {
// FirstUniqueStrings returns all unique elements of a slice of strings, keeping the first copy of
// each.  It modifies the slice contents in place, and returns a subslice of the original slice.
func FirstUniqueStrings(list []string) []string {
	// Do not moodify the input in-place, operate on a copy instead.
	list = CopyOf(list)
	// 128 was chosen based on BenchmarkFirstUniqueStrings results.
	if len(list) > 128 {
		return firstUniqueStringsMap(list)
@@ -332,6 +334,7 @@ func LastUniqueStrings(list []string) []string {

// SortedUniqueStrings returns what the name says
func SortedUniqueStrings(list []string) []string {
	// FirstUniqueStrings creates a copy of `list`, so the input remains untouched.
	unique := FirstUniqueStrings(list)
	sort.Strings(unique)
	return unique