android: Allow running some singletons in parallel.
Many of the singletons are trivial and can be run in parallel, improving the performance during analysis. Bug: 281536768 Test: manual, presubmit Change-Id: I989333e2ff3fe71783601f27bf5e0732a1b4ea61
This commit is contained in:
@@ -65,16 +65,19 @@ type singleton struct {
|
|||||||
// True if this should be registered as a pre-singleton, false otherwise.
|
// True if this should be registered as a pre-singleton, false otherwise.
|
||||||
pre bool
|
pre bool
|
||||||
|
|
||||||
|
// True if this should be registered as a parallel singleton.
|
||||||
|
parallel bool
|
||||||
|
|
||||||
name string
|
name string
|
||||||
factory SingletonFactory
|
factory SingletonFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSingleton(name string, factory SingletonFactory) singleton {
|
func newSingleton(name string, factory SingletonFactory, parallel bool) singleton {
|
||||||
return singleton{false, name, factory}
|
return singleton{pre: false, parallel: parallel, name: name, factory: factory}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPreSingleton(name string, factory SingletonFactory) singleton {
|
func newPreSingleton(name string, factory SingletonFactory) singleton {
|
||||||
return singleton{true, name, factory}
|
return singleton{pre: true, parallel: false, name: name, factory: factory}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s singleton) componentName() string {
|
func (s singleton) componentName() string {
|
||||||
@@ -86,7 +89,7 @@ func (s singleton) register(ctx *Context) {
|
|||||||
if s.pre {
|
if s.pre {
|
||||||
ctx.RegisterPreSingletonType(s.name, adaptor)
|
ctx.RegisterPreSingletonType(s.name, adaptor)
|
||||||
} else {
|
} else {
|
||||||
ctx.RegisterSingletonType(s.name, adaptor)
|
ctx.RegisterSingletonType(s.name, adaptor, s.parallel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,8 +148,16 @@ func RegisterModuleTypeForDocs(name string, factory reflect.Value) {
|
|||||||
moduleTypeByFactory[factory] = name
|
moduleTypeByFactory[factory] = name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func registerSingletonType(name string, factory SingletonFactory, parallel bool) {
|
||||||
|
singletons = append(singletons, newSingleton(name, factory, parallel))
|
||||||
|
}
|
||||||
|
|
||||||
func RegisterSingletonType(name string, factory SingletonFactory) {
|
func RegisterSingletonType(name string, factory SingletonFactory) {
|
||||||
singletons = append(singletons, newSingleton(name, factory))
|
registerSingletonType(name, factory, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterParallelSingletonType(name string, factory SingletonFactory) {
|
||||||
|
registerSingletonType(name, factory, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterPreSingletonType(name string, factory SingletonFactory) {
|
func RegisterPreSingletonType(name string, factory SingletonFactory) {
|
||||||
@@ -220,17 +231,17 @@ func (ctx *Context) registerSingletonMakeVarsProvider(makevars SingletonMakeVars
|
|||||||
func collateGloballyRegisteredSingletons() sortableComponents {
|
func collateGloballyRegisteredSingletons() sortableComponents {
|
||||||
allSingletons := append(sortableComponents(nil), singletons...)
|
allSingletons := append(sortableComponents(nil), singletons...)
|
||||||
allSingletons = append(allSingletons,
|
allSingletons = append(allSingletons,
|
||||||
singleton{false, "bazeldeps", BazelSingleton},
|
singleton{pre: false, parallel: false, name: "bazeldeps", factory: BazelSingleton},
|
||||||
|
|
||||||
// Register phony just before makevars so it can write out its phony rules as Make rules
|
// Register phony just before makevars so it can write out its phony rules as Make rules
|
||||||
singleton{false, "phony", phonySingletonFactory},
|
singleton{pre: false, parallel: false, name: "phony", factory: phonySingletonFactory},
|
||||||
|
|
||||||
// Register makevars after other singletons so they can export values through makevars
|
// Register makevars after other singletons so they can export values through makevars
|
||||||
singleton{false, "makevars", makeVarsSingletonFunc},
|
singleton{pre: false, parallel: false, name: "makevars", factory: makeVarsSingletonFunc},
|
||||||
|
|
||||||
// Register env and ninjadeps last so that they can track all used environment variables and
|
// Register env and ninjadeps last so that they can track all used environment variables and
|
||||||
// Ninja file dependencies stored in the config.
|
// Ninja file dependencies stored in the config.
|
||||||
singleton{false, "ninjadeps", ninjaDepsSingletonFactory},
|
singleton{pre: false, parallel: false, name: "ninjadeps", factory: ninjaDepsSingletonFactory},
|
||||||
)
|
)
|
||||||
|
|
||||||
return allSingletons
|
return allSingletons
|
||||||
@@ -259,7 +270,9 @@ func ModuleTypeByFactory() map[reflect.Value]string {
|
|||||||
type RegistrationContext interface {
|
type RegistrationContext interface {
|
||||||
RegisterModuleType(name string, factory ModuleFactory)
|
RegisterModuleType(name string, factory ModuleFactory)
|
||||||
RegisterSingletonModuleType(name string, factory SingletonModuleFactory)
|
RegisterSingletonModuleType(name string, factory SingletonModuleFactory)
|
||||||
|
RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory)
|
||||||
RegisterPreSingletonType(name string, factory SingletonFactory)
|
RegisterPreSingletonType(name string, factory SingletonFactory)
|
||||||
|
RegisterParallelSingletonType(name string, factory SingletonFactory)
|
||||||
RegisterSingletonType(name string, factory SingletonFactory)
|
RegisterSingletonType(name string, factory SingletonFactory)
|
||||||
PreArchMutators(f RegisterMutatorFunc)
|
PreArchMutators(f RegisterMutatorFunc)
|
||||||
|
|
||||||
@@ -315,8 +328,15 @@ func (ctx *initRegistrationContext) RegisterModuleType(name string, factory Modu
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *initRegistrationContext) RegisterSingletonModuleType(name string, factory SingletonModuleFactory) {
|
func (ctx *initRegistrationContext) RegisterSingletonModuleType(name string, factory SingletonModuleFactory) {
|
||||||
|
ctx.registerSingletonModuleType(name, factory, false)
|
||||||
|
}
|
||||||
|
func (ctx *initRegistrationContext) RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory) {
|
||||||
|
ctx.registerSingletonModuleType(name, factory, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *initRegistrationContext) registerSingletonModuleType(name string, factory SingletonModuleFactory, parallel bool) {
|
||||||
s, m := SingletonModuleFactoryAdaptor(name, factory)
|
s, m := SingletonModuleFactoryAdaptor(name, factory)
|
||||||
ctx.RegisterSingletonType(name, s)
|
ctx.registerSingletonType(name, s, parallel)
|
||||||
ctx.RegisterModuleType(name, m)
|
ctx.RegisterModuleType(name, m)
|
||||||
// Overwrite moduleTypesForDocs with the original factory instead of the lambda returned by
|
// Overwrite moduleTypesForDocs with the original factory instead of the lambda returned by
|
||||||
// SingletonModuleFactoryAdaptor so that docs can find the module type documentation on the
|
// SingletonModuleFactoryAdaptor so that docs can find the module type documentation on the
|
||||||
@@ -324,12 +344,20 @@ func (ctx *initRegistrationContext) RegisterSingletonModuleType(name string, fac
|
|||||||
RegisterModuleTypeForDocs(name, reflect.ValueOf(factory))
|
RegisterModuleTypeForDocs(name, reflect.ValueOf(factory))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *initRegistrationContext) RegisterSingletonType(name string, factory SingletonFactory) {
|
func (ctx *initRegistrationContext) registerSingletonType(name string, factory SingletonFactory, parallel bool) {
|
||||||
if _, present := ctx.singletonTypes[name]; present {
|
if _, present := ctx.singletonTypes[name]; present {
|
||||||
panic(fmt.Sprintf("singleton type %q is already registered", name))
|
panic(fmt.Sprintf("singleton type %q is already registered", name))
|
||||||
}
|
}
|
||||||
ctx.singletonTypes[name] = factory
|
ctx.singletonTypes[name] = factory
|
||||||
RegisterSingletonType(name, factory)
|
registerSingletonType(name, factory, parallel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *initRegistrationContext) RegisterSingletonType(name string, factory SingletonFactory) {
|
||||||
|
ctx.registerSingletonType(name, factory, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *initRegistrationContext) RegisterParallelSingletonType(name string, factory SingletonFactory) {
|
||||||
|
ctx.registerSingletonType(name, factory, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *initRegistrationContext) RegisterPreSingletonType(name string, factory SingletonFactory) {
|
func (ctx *initRegistrationContext) RegisterPreSingletonType(name string, factory SingletonFactory) {
|
||||||
|
@@ -495,8 +495,18 @@ func (ctx *TestContext) RegisterSingletonModuleType(name string, factory Singlet
|
|||||||
ctx.RegisterModuleType(name, m)
|
ctx.RegisterModuleType(name, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ctx *TestContext) RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory) {
|
||||||
|
s, m := SingletonModuleFactoryAdaptor(name, factory)
|
||||||
|
ctx.RegisterParallelSingletonType(name, s)
|
||||||
|
ctx.RegisterModuleType(name, m)
|
||||||
|
}
|
||||||
|
|
||||||
func (ctx *TestContext) RegisterSingletonType(name string, factory SingletonFactory) {
|
func (ctx *TestContext) RegisterSingletonType(name string, factory SingletonFactory) {
|
||||||
ctx.singletons = append(ctx.singletons, newSingleton(name, factory))
|
ctx.singletons = append(ctx.singletons, newSingleton(name, factory, false))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *TestContext) RegisterParallelSingletonType(name string, factory SingletonFactory) {
|
||||||
|
ctx.singletons = append(ctx.singletons, newSingleton(name, factory, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *TestContext) RegisterPreSingletonType(name string, factory SingletonFactory) {
|
func (ctx *TestContext) RegisterPreSingletonType(name string, factory SingletonFactory) {
|
||||||
|
Reference in New Issue
Block a user