diff options
author | Yangster-mac <yanglu@google.com> | 2018-01-10 21:31:59 -0800 |
---|---|---|
committer | Yangster <yanglu@google.com> | 2018-01-15 16:41:29 -0800 |
commit | ba5b9e44bbfa7577c45c5c5e7e75cc1cd82a31b7 (patch) | |
tree | 275dfe9ba25338043f86c3f9ef4f431c135991a7 /tools/stats_log_api_gen/Collation.cpp | |
parent | 02c0e98600b6b0cdf912effea48877b5ddbafed9 (diff) |
Stats log interface for single node attribution chain.
Usually the input parameters for attribution chain is list of int64/string.
The new c++interface takes one int64 and one string as input and write
as a single node into logd.
This will help avoid allocating temp objects in battery stats java code.
Test: all statsd unit test passed.
Change-Id: Ia0f7f26b71a570bd3628c42726a5afb0a500d073
Diffstat (limited to 'tools/stats_log_api_gen/Collation.cpp')
-rw-r--r-- | tools/stats_log_api_gen/Collation.cpp | 71 |
1 files changed, 66 insertions, 5 deletions
diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp index 80853b13a7cc..0e57f7ff0ed2 100644 --- a/tools/stats_log_api_gen/Collation.cpp +++ b/tools/stats_log_api_gen/Collation.cpp @@ -15,6 +15,7 @@ */ #include "Collation.h" +#include "frameworks/base/cmds/statsd/src/atoms.pb.h" #include <stdio.h> #include <map> @@ -137,6 +138,16 @@ java_type(const FieldDescriptor* field) } /** + * Gather the enums info. + */ +void collate_enums(const EnumDescriptor &enumDescriptor, AtomField *atomField) { + for (int i = 0; i < enumDescriptor.value_count(); i++) { + atomField->enumValues[enumDescriptor.value(i)->number()] = + enumDescriptor.value(i)->name().c_str(); + } +} + +/** * Gather the info about an atom proto. */ int collate_atom(const Descriptor *atom, AtomDecl *atomDecl, @@ -221,11 +232,7 @@ int collate_atom(const Descriptor *atom, AtomDecl *atomDecl, if (javaType == JAVA_TYPE_ENUM) { // All enums are treated as ints when it comes to function signatures. signature->push_back(JAVA_TYPE_INT); - const EnumDescriptor *enumDescriptor = field->enum_type(); - for (int i = 0; i < enumDescriptor->value_count(); i++) { - atField.enumValues[enumDescriptor->value(i)->number()] = - enumDescriptor->value(i)->name().c_str(); - } + collate_enums(*field->enum_type(), &atField); } else { signature->push_back(javaType); } @@ -235,6 +242,53 @@ int collate_atom(const Descriptor *atom, AtomDecl *atomDecl, return errorCount; } +// This function flattens the fields of the AttributionNode proto in an Atom proto and generates +// the corresponding atom decl and signature. +bool get_non_chained_node(const Descriptor *atom, AtomDecl *atomDecl, + vector<java_type_t> *signature) { + // Build a sorted list of the fields. Descriptor has them in source file + // order. + map<int, const FieldDescriptor *> fields; + for (int j = 0; j < atom->field_count(); j++) { + const FieldDescriptor *field = atom->field(j); + fields[field->number()] = field; + } + + AtomDecl attributionDecl; + vector<java_type_t> attributionSignature; + collate_atom(android::os::statsd::AttributionNode::descriptor(), + &attributionDecl, &attributionSignature); + + // Build the type signature and the atom data. + bool has_attribution_node = false; + for (map<int, const FieldDescriptor *>::const_iterator it = fields.begin(); + it != fields.end(); it++) { + const FieldDescriptor *field = it->second; + java_type_t javaType = java_type(field); + if (javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) { + atomDecl->fields.insert( + atomDecl->fields.end(), + attributionDecl.fields.begin(), attributionDecl.fields.end()); + signature->insert( + signature->end(), + attributionSignature.begin(), attributionSignature.end()); + has_attribution_node = true; + + } else { + AtomField atField(field->name(), javaType); + if (javaType == JAVA_TYPE_ENUM) { + // All enums are treated as ints when it comes to function signatures. + signature->push_back(JAVA_TYPE_INT); + collate_enums(*field->enum_type(), &atField); + } else { + signature->push_back(javaType); + } + atomDecl->fields.push_back(atField); + } + } + return has_attribution_node; +} + /** * Gather the info about the atoms. */ @@ -266,6 +320,13 @@ int collate_atoms(const Descriptor *descriptor, Atoms *atoms) { errorCount += collate_atom(atom, &atomDecl, &signature); atoms->signatures.insert(signature); atoms->decls.insert(atomDecl); + + AtomDecl nonChainedAtomDecl(atomField->number(), atomField->name(), atom->name()); + vector<java_type_t> nonChainedSignature; + if (get_non_chained_node(atom, &nonChainedAtomDecl, &nonChainedSignature)) { + atoms->non_chained_signatures.insert(nonChainedSignature); + atoms->non_chained_decls.insert(nonChainedAtomDecl); + } } if (dbg) { |