diff --git a/cmds/statsd/src/atom_field_options.proto b/cmds/statsd/src/atom_field_options.proto index 9c875ba7502d1..40a24dc52e524 100644 --- a/cmds/statsd/src/atom_field_options.proto +++ b/cmds/statsd/src/atom_field_options.proto @@ -116,5 +116,5 @@ extend google.protobuf.FieldOptions { optional bool allow_from_any_uid = 50003 [default = false]; - optional string module = 50004; + repeated string module = 50004; } diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp index aa356f1c35d23..66c4b1488b83e 100644 --- a/tools/stats_log_api_gen/Collation.cpp +++ b/tools/stats_log_api_gen/Collation.cpp @@ -53,8 +53,7 @@ AtomDecl::AtomDecl(const AtomDecl &that) uidField(that.uidField), whitelisted(that.whitelisted), binaryFields(that.binaryFields), - hasModule(that.hasModule), - moduleName(that.moduleName) {} + moduleNames(that.moduleNames) {} AtomDecl::AtomDecl(int c, const string& n, const string& m) :code(c), @@ -442,9 +441,9 @@ int collate_atoms(const Descriptor *descriptor, Atoms *atoms) { atomDecl.whitelisted = true; } - if (atomField->options().HasExtension(os::statsd::module)) { - atomDecl.hasModule = true; - atomDecl.moduleName = atomField->options().GetExtension(os::statsd::module); + for (int j = 0; j < atomField->options().ExtensionSize(os::statsd::module); ++j) { + const string moduleName = atomField->options().GetExtension(os::statsd::module, j); + atomDecl.moduleNames.insert(moduleName); } vector signature; @@ -453,36 +452,15 @@ int collate_atoms(const Descriptor *descriptor, Atoms *atoms) { errorCount++; } - // Add the signature if does not already exist. - auto signature_to_modules_it = atoms->signatures_to_modules.find(signature); - if (signature_to_modules_it == atoms->signatures_to_modules.end()) { - set modules; - if (atomDecl.hasModule) { - modules.insert(atomDecl.moduleName); - } - atoms->signatures_to_modules[signature] = modules; - } else { - if (atomDecl.hasModule) { - signature_to_modules_it->second.insert(atomDecl.moduleName); - } - } + atoms->signatures_to_modules[signature].insert( + atomDecl.moduleNames.begin(), atomDecl.moduleNames.end()); atoms->decls.insert(atomDecl); AtomDecl nonChainedAtomDecl(atomField->number(), atomField->name(), atom->name()); vector nonChainedSignature; if (get_non_chained_node(atom, &nonChainedAtomDecl, &nonChainedSignature)) { - auto it = atoms->non_chained_signatures_to_modules.find(nonChainedSignature); - if (it == atoms->non_chained_signatures_to_modules.end()) { - set modules_non_chained; - if (atomDecl.hasModule) { - modules_non_chained.insert(atomDecl.moduleName); - } - atoms->non_chained_signatures_to_modules[nonChainedSignature] = modules_non_chained; - } else { - if (atomDecl.hasModule) { - it->second.insert(atomDecl.moduleName); - } - } + atoms->non_chained_signatures_to_modules[nonChainedSignature].insert( + atomDecl.moduleNames.begin(), atomDecl.moduleNames.end()); atoms->non_chained_decls.insert(nonChainedAtomDecl); } diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h index 65d8e3efee5b9..ace85e06f12df 100644 --- a/tools/stats_log_api_gen/Collation.h +++ b/tools/stats_log_api_gen/Collation.h @@ -98,8 +98,7 @@ struct AtomDecl { vector binaryFields; - bool hasModule = false; - string moduleName; + set moduleNames; AtomDecl(); AtomDecl(const AtomDecl& that); diff --git a/tools/stats_log_api_gen/test.proto b/tools/stats_log_api_gen/test.proto index eab622d77ef7d..f6c89c22ee65c 100644 --- a/tools/stats_log_api_gen/test.proto +++ b/tools/stats_log_api_gen/test.proto @@ -213,6 +213,10 @@ message ModuleTwoAtom { optional int32 field = 1; } +message ModuleOneAndTwoAtom { + optional int32 field = 1; +} + message NoModuleAtom { optional string field = 1; } @@ -221,6 +225,9 @@ message ModuleAtoms { oneof event { ModuleOneAtom module_one_atom = 1 [(android.os.statsd.module) = "module1"]; ModuleTwoAtom module_two_atom = 2 [(android.os.statsd.module) = "module2"]; - NoModuleAtom no_module_atom = 3; + ModuleOneAndTwoAtom module_one_and_two_atom = 3 [ + (android.os.statsd.module) = "module1", (android.os.statsd.module) = "module2" + ]; + NoModuleAtom no_module_atom = 4; } } diff --git a/tools/stats_log_api_gen/test_collation.cpp b/tools/stats_log_api_gen/test_collation.cpp index a972e2342cad0..73abaef1d91bc 100644 --- a/tools/stats_log_api_gen/test_collation.cpp +++ b/tools/stats_log_api_gen/test_collation.cpp @@ -248,23 +248,27 @@ TEST(CollationTest, PassOnLogFromModuleAtom) { Atoms atoms; int errorCount = collate_atoms(ModuleAtoms::descriptor(), &atoms); EXPECT_EQ(errorCount, 0); - EXPECT_EQ(atoms.decls.size(), 3ul); + EXPECT_EQ(atoms.decls.size(), 4ul); } TEST(CollationTest, RecognizeModuleAtom) { Atoms atoms; int errorCount = collate_atoms(ModuleAtoms::descriptor(), &atoms); EXPECT_EQ(errorCount, 0); - EXPECT_EQ(atoms.decls.size(), 3ul); + EXPECT_EQ(atoms.decls.size(), 4ul); for (const auto& atomDecl: atoms.decls) { if (atomDecl.code == 1) { - EXPECT_TRUE(atomDecl.hasModule); - EXPECT_EQ(atomDecl.moduleName, "module1"); + EXPECT_EQ(1ul, atomDecl.moduleNames.size()); + EXPECT_NE(atomDecl.moduleNames.end(), atomDecl.moduleNames.find("module1")); } else if (atomDecl.code == 2) { - EXPECT_TRUE(atomDecl.hasModule); - EXPECT_EQ(atomDecl.moduleName, "module2"); + EXPECT_EQ(1ul, atomDecl.moduleNames.size()); + EXPECT_NE(atomDecl.moduleNames.end(), atomDecl.moduleNames.find("module2")); + } else if (atomDecl.code == 3) { + EXPECT_EQ(2ul, atomDecl.moduleNames.size()); + EXPECT_NE(atomDecl.moduleNames.end(), atomDecl.moduleNames.find("module1")); + EXPECT_NE(atomDecl.moduleNames.end(), atomDecl.moduleNames.find("module2")); } else { - EXPECT_FALSE(atomDecl.hasModule); + EXPECT_TRUE(atomDecl.moduleNames.empty()); } } @@ -286,4 +290,4 @@ TEST(CollationTest, RecognizeModuleAtom) { } } // namespace stats_log_api_gen -} // namespace android \ No newline at end of file +} // namespace android diff --git a/tools/stats_log_api_gen/utils.cpp b/tools/stats_log_api_gen/utils.cpp index cd6914b4fc06b..9dc4ff8273806 100644 --- a/tools/stats_log_api_gen/utils.cpp +++ b/tools/stats_log_api_gen/utils.cpp @@ -102,7 +102,7 @@ bool atom_needed_for_module(const AtomDecl& atomDecl, const string& moduleName) if (moduleName == DEFAULT_MODULE_NAME) { return true; } - return atomDecl.hasModule && (moduleName == atomDecl.moduleName); + return atomDecl.moduleNames.find(moduleName) != atomDecl.moduleNames.end(); } bool signature_needed_for_module(const set& modules, const string& moduleName) {