Loading base/include/android-base/thread_annotations.h +6 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,12 @@ #define PT_GUARDED_BY(x) \ THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) #define EXCLUSIVE_LOCKS_REQUIRED(...) \ THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) #define SHARED_LOCKS_REQUIRED(...) \ THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) #define ACQUIRED_BEFORE(...) \ THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) Loading healthd/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ cc_binary { static_libs: [ "android.hardware.health@2.0-impl", "android.hardware.health@1.0-convert", "libhealthstoragedefault", "libbatterymonitor", ], Loading Loading @@ -72,6 +73,7 @@ cc_binary { "android.hardware.health@2.0-impl", "android.hardware.health@1.0-convert", "libbatterymonitor", "libhealthstoragedefault", ], shared_libs: [ Loading healthd/Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ LOCAL_STATIC_LIBRARIES := \ android.hardware.health@2.0 \ android.hardware.health@2.0-impl \ android.hardware.health@1.0 \ libhealthstoragedefault \ libminui \ libpng \ libz \ Loading Loading @@ -98,6 +99,7 @@ CHARGER_STATIC_LIBRARIES := \ libhidltransport \ libhidlbase \ libhwbinder \ libhealthstoragedefault \ libvndksupport \ libhealthd_charger \ libhealthd_draw \ Loading init/action.cpp +12 −5 Original line number Diff line number Diff line Loading @@ -50,12 +50,19 @@ Command::Command(BuiltinFunction f, bool execute_in_subcontext, : func_(std::move(f)), execute_in_subcontext_(execute_in_subcontext), args_(args), line_(line) {} Result<Success> Command::InvokeFunc(Subcontext* subcontext) const { if (execute_in_subcontext_ && subcontext) { if (subcontext) { if (execute_in_subcontext_) { return subcontext->Execute(args_); } else { const std::string& context = subcontext ? subcontext->context() : kInitContext; return RunBuiltinFunction(func_, args_, context); } auto expanded_args = subcontext->ExpandArgs(args_); if (!expanded_args) { return expanded_args.error(); } return RunBuiltinFunction(func_, *expanded_args, subcontext->context()); } return RunBuiltinFunction(func_, args_, kInitContext); } std::string Command::BuildCommandString() const { Loading init/subcontext.cpp +77 −27 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ #include "action.h" #include "selinux.h" #include "system/core/init/subcontext.pb.h" #include "util.h" using android::base::GetExecutablePath; Loading Loading @@ -84,7 +83,9 @@ class SubcontextProcess { private: void RunCommand(const SubcontextCommand::ExecuteCommand& execute_command, SubcontextReply::ResultMessage* result_message) const; SubcontextReply* reply) const; void ExpandArgs(const SubcontextCommand::ExpandArgsCommand& expand_args_command, SubcontextReply* reply) const; const KeywordFunctionMap* function_map_; const std::string context_; Loading @@ -92,7 +93,7 @@ class SubcontextProcess { }; void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& execute_command, SubcontextReply::ResultMessage* result_message) const { SubcontextReply* reply) const { // Need to use ArraySplice instead of this code. auto args = std::vector<std::string>(); for (const auto& string : execute_command.args()) { Loading @@ -108,11 +109,27 @@ void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& exec } if (result) { result_message->set_success(true); reply->set_success(true); } else { result_message->set_success(false); result_message->set_error_string(result.error_string()); result_message->set_error_errno(result.error_errno()); auto* failure = reply->mutable_failure(); failure->set_error_string(result.error_string()); failure->set_error_errno(result.error_errno()); } } void SubcontextProcess::ExpandArgs(const SubcontextCommand::ExpandArgsCommand& expand_args_command, SubcontextReply* reply) const { for (const auto& arg : expand_args_command.args()) { auto expanded_prop = std::string{}; if (!expand_props(arg, &expanded_prop)) { auto* failure = reply->mutable_failure(); failure->set_error_string("Failed to expand '" + arg + "'"); failure->set_error_errno(0); return; } else { auto* expand_args_reply = reply->mutable_expand_args_reply(); expand_args_reply->add_expanded_args(expanded_prop); } } } Loading Loading @@ -142,7 +159,11 @@ void SubcontextProcess::MainLoop() { auto reply = SubcontextReply(); switch (subcontext_command.command_case()) { case SubcontextCommand::kExecuteCommand: { RunCommand(subcontext_command.execute_command(), reply.mutable_result()); RunCommand(subcontext_command.execute_command(), &reply); break; } case SubcontextCommand::kExpandArgsCommand: { ExpandArgs(subcontext_command.expand_args_command(), &reply); break; } default: Loading Loading @@ -219,12 +240,7 @@ void Subcontext::Restart() { Fork(); } Result<Success> Subcontext::Execute(const std::vector<std::string>& args) { auto subcontext_command = SubcontextCommand(); std::copy( args.begin(), args.end(), RepeatedPtrFieldBackInserter(subcontext_command.mutable_execute_command()->mutable_args())); Result<SubcontextReply> Subcontext::TransmitMessage(const SubcontextCommand& subcontext_command) { if (auto result = SendMessage(socket_, subcontext_command); !result) { Restart(); return ErrnoError() << "Failed to send message to subcontext"; Loading @@ -236,25 +252,59 @@ Result<Success> Subcontext::Execute(const std::vector<std::string>& args) { return Error() << "Failed to receive result from subcontext: " << subcontext_message.error(); } auto subcontext_reply = SubcontextReply(); auto subcontext_reply = SubcontextReply{}; if (!subcontext_reply.ParseFromString(*subcontext_message)) { Restart(); return Error() << "Unable to parse message from subcontext"; } if (subcontext_reply.reply_case() == SubcontextReply::kFailure) { auto& failure = subcontext_reply.failure(); return ResultError(failure.error_string(), failure.error_errno()); } return subcontext_reply; } Result<Success> Subcontext::Execute(const std::vector<std::string>& args) { auto subcontext_command = SubcontextCommand(); std::copy( args.begin(), args.end(), RepeatedPtrFieldBackInserter(subcontext_command.mutable_execute_command()->mutable_args())); auto subcontext_reply = TransmitMessage(subcontext_command); if (!subcontext_reply) { return subcontext_reply.error(); } if (subcontext_reply->reply_case() != SubcontextReply::kSuccess) { return Error() << "Unexpected message type from subcontext: " << subcontext_reply->reply_case(); } switch (subcontext_reply.reply_case()) { case SubcontextReply::kResult: { auto result = subcontext_reply.result(); if (result.success()) { return Success(); } else { return ResultError(result.error_string(), result.error_errno()); } Result<std::vector<std::string>> Subcontext::ExpandArgs(const std::vector<std::string>& args) { auto subcontext_command = SubcontextCommand{}; std::copy(args.begin(), args.end(), RepeatedPtrFieldBackInserter( subcontext_command.mutable_expand_args_command()->mutable_args())); auto subcontext_reply = TransmitMessage(subcontext_command); if (!subcontext_reply) { return subcontext_reply.error(); } if (subcontext_reply->reply_case() != SubcontextReply::kExpandArgsReply) { return Error() << "Unexpected message type from subcontext: " << subcontext_reply->reply_case(); } default: return Error() << "Unknown message type from subcontext: " << subcontext_reply.reply_case(); auto& reply = subcontext_reply->expand_args_reply(); auto expanded_args = std::vector<std::string>{}; for (const auto& string : reply.expanded_args()) { expanded_args.emplace_back(string); } return expanded_args; } static std::vector<Subcontext> subcontexts; Loading Loading
base/include/android-base/thread_annotations.h +6 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,12 @@ #define PT_GUARDED_BY(x) \ THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) #define EXCLUSIVE_LOCKS_REQUIRED(...) \ THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) #define SHARED_LOCKS_REQUIRED(...) \ THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) #define ACQUIRED_BEFORE(...) \ THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) Loading
healthd/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ cc_binary { static_libs: [ "android.hardware.health@2.0-impl", "android.hardware.health@1.0-convert", "libhealthstoragedefault", "libbatterymonitor", ], Loading Loading @@ -72,6 +73,7 @@ cc_binary { "android.hardware.health@2.0-impl", "android.hardware.health@1.0-convert", "libbatterymonitor", "libhealthstoragedefault", ], shared_libs: [ Loading
healthd/Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ LOCAL_STATIC_LIBRARIES := \ android.hardware.health@2.0 \ android.hardware.health@2.0-impl \ android.hardware.health@1.0 \ libhealthstoragedefault \ libminui \ libpng \ libz \ Loading Loading @@ -98,6 +99,7 @@ CHARGER_STATIC_LIBRARIES := \ libhidltransport \ libhidlbase \ libhwbinder \ libhealthstoragedefault \ libvndksupport \ libhealthd_charger \ libhealthd_draw \ Loading
init/action.cpp +12 −5 Original line number Diff line number Diff line Loading @@ -50,12 +50,19 @@ Command::Command(BuiltinFunction f, bool execute_in_subcontext, : func_(std::move(f)), execute_in_subcontext_(execute_in_subcontext), args_(args), line_(line) {} Result<Success> Command::InvokeFunc(Subcontext* subcontext) const { if (execute_in_subcontext_ && subcontext) { if (subcontext) { if (execute_in_subcontext_) { return subcontext->Execute(args_); } else { const std::string& context = subcontext ? subcontext->context() : kInitContext; return RunBuiltinFunction(func_, args_, context); } auto expanded_args = subcontext->ExpandArgs(args_); if (!expanded_args) { return expanded_args.error(); } return RunBuiltinFunction(func_, *expanded_args, subcontext->context()); } return RunBuiltinFunction(func_, args_, kInitContext); } std::string Command::BuildCommandString() const { Loading
init/subcontext.cpp +77 −27 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ #include "action.h" #include "selinux.h" #include "system/core/init/subcontext.pb.h" #include "util.h" using android::base::GetExecutablePath; Loading Loading @@ -84,7 +83,9 @@ class SubcontextProcess { private: void RunCommand(const SubcontextCommand::ExecuteCommand& execute_command, SubcontextReply::ResultMessage* result_message) const; SubcontextReply* reply) const; void ExpandArgs(const SubcontextCommand::ExpandArgsCommand& expand_args_command, SubcontextReply* reply) const; const KeywordFunctionMap* function_map_; const std::string context_; Loading @@ -92,7 +93,7 @@ class SubcontextProcess { }; void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& execute_command, SubcontextReply::ResultMessage* result_message) const { SubcontextReply* reply) const { // Need to use ArraySplice instead of this code. auto args = std::vector<std::string>(); for (const auto& string : execute_command.args()) { Loading @@ -108,11 +109,27 @@ void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& exec } if (result) { result_message->set_success(true); reply->set_success(true); } else { result_message->set_success(false); result_message->set_error_string(result.error_string()); result_message->set_error_errno(result.error_errno()); auto* failure = reply->mutable_failure(); failure->set_error_string(result.error_string()); failure->set_error_errno(result.error_errno()); } } void SubcontextProcess::ExpandArgs(const SubcontextCommand::ExpandArgsCommand& expand_args_command, SubcontextReply* reply) const { for (const auto& arg : expand_args_command.args()) { auto expanded_prop = std::string{}; if (!expand_props(arg, &expanded_prop)) { auto* failure = reply->mutable_failure(); failure->set_error_string("Failed to expand '" + arg + "'"); failure->set_error_errno(0); return; } else { auto* expand_args_reply = reply->mutable_expand_args_reply(); expand_args_reply->add_expanded_args(expanded_prop); } } } Loading Loading @@ -142,7 +159,11 @@ void SubcontextProcess::MainLoop() { auto reply = SubcontextReply(); switch (subcontext_command.command_case()) { case SubcontextCommand::kExecuteCommand: { RunCommand(subcontext_command.execute_command(), reply.mutable_result()); RunCommand(subcontext_command.execute_command(), &reply); break; } case SubcontextCommand::kExpandArgsCommand: { ExpandArgs(subcontext_command.expand_args_command(), &reply); break; } default: Loading Loading @@ -219,12 +240,7 @@ void Subcontext::Restart() { Fork(); } Result<Success> Subcontext::Execute(const std::vector<std::string>& args) { auto subcontext_command = SubcontextCommand(); std::copy( args.begin(), args.end(), RepeatedPtrFieldBackInserter(subcontext_command.mutable_execute_command()->mutable_args())); Result<SubcontextReply> Subcontext::TransmitMessage(const SubcontextCommand& subcontext_command) { if (auto result = SendMessage(socket_, subcontext_command); !result) { Restart(); return ErrnoError() << "Failed to send message to subcontext"; Loading @@ -236,25 +252,59 @@ Result<Success> Subcontext::Execute(const std::vector<std::string>& args) { return Error() << "Failed to receive result from subcontext: " << subcontext_message.error(); } auto subcontext_reply = SubcontextReply(); auto subcontext_reply = SubcontextReply{}; if (!subcontext_reply.ParseFromString(*subcontext_message)) { Restart(); return Error() << "Unable to parse message from subcontext"; } if (subcontext_reply.reply_case() == SubcontextReply::kFailure) { auto& failure = subcontext_reply.failure(); return ResultError(failure.error_string(), failure.error_errno()); } return subcontext_reply; } Result<Success> Subcontext::Execute(const std::vector<std::string>& args) { auto subcontext_command = SubcontextCommand(); std::copy( args.begin(), args.end(), RepeatedPtrFieldBackInserter(subcontext_command.mutable_execute_command()->mutable_args())); auto subcontext_reply = TransmitMessage(subcontext_command); if (!subcontext_reply) { return subcontext_reply.error(); } if (subcontext_reply->reply_case() != SubcontextReply::kSuccess) { return Error() << "Unexpected message type from subcontext: " << subcontext_reply->reply_case(); } switch (subcontext_reply.reply_case()) { case SubcontextReply::kResult: { auto result = subcontext_reply.result(); if (result.success()) { return Success(); } else { return ResultError(result.error_string(), result.error_errno()); } Result<std::vector<std::string>> Subcontext::ExpandArgs(const std::vector<std::string>& args) { auto subcontext_command = SubcontextCommand{}; std::copy(args.begin(), args.end(), RepeatedPtrFieldBackInserter( subcontext_command.mutable_expand_args_command()->mutable_args())); auto subcontext_reply = TransmitMessage(subcontext_command); if (!subcontext_reply) { return subcontext_reply.error(); } if (subcontext_reply->reply_case() != SubcontextReply::kExpandArgsReply) { return Error() << "Unexpected message type from subcontext: " << subcontext_reply->reply_case(); } default: return Error() << "Unknown message type from subcontext: " << subcontext_reply.reply_case(); auto& reply = subcontext_reply->expand_args_reply(); auto expanded_args = std::vector<std::string>{}; for (const auto& string : reply.expanded_args()) { expanded_args.emplace_back(string); } return expanded_args; } static std::vector<Subcontext> subcontexts; Loading