init: fix restarting of subcontext am: e70c28bdad
am: 18603dab4e
am: 497026f429
Change-Id: I344d2c15543d75d00e58e069817a2c0a483df952
This commit is contained in:
commit
0afef6921c
|
@ -75,6 +75,7 @@
|
|||
#include "service.h"
|
||||
#include "service_parser.h"
|
||||
#include "sigchld_handler.h"
|
||||
#include "subcontext.h"
|
||||
#include "system/core/init/property_service.pb.h"
|
||||
#include "util.h"
|
||||
|
||||
|
@ -99,8 +100,6 @@ static int property_triggers_enabled = 0;
|
|||
static int signal_fd = -1;
|
||||
static int property_fd = -1;
|
||||
|
||||
static std::unique_ptr<Subcontext> subcontext;
|
||||
|
||||
struct PendingControlMessage {
|
||||
std::string message;
|
||||
std::string name;
|
||||
|
@ -253,9 +252,8 @@ Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) {
|
|||
Parser parser;
|
||||
|
||||
parser.AddSectionParser("service", std::make_unique<ServiceParser>(
|
||||
&service_list, subcontext.get(), std::nullopt));
|
||||
parser.AddSectionParser("on",
|
||||
std::make_unique<ActionParser>(&action_manager, subcontext.get()));
|
||||
&service_list, GetSubcontext(), std::nullopt));
|
||||
parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, GetSubcontext()));
|
||||
parser.AddSectionParser("import", std::make_unique<ImportParser>(&parser));
|
||||
|
||||
return parser;
|
||||
|
@ -265,9 +263,9 @@ Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) {
|
|||
Parser CreateServiceOnlyParser(ServiceList& service_list, bool from_apex) {
|
||||
Parser parser;
|
||||
|
||||
parser.AddSectionParser("service",
|
||||
std::make_unique<ServiceParser>(&service_list, subcontext.get(),
|
||||
std::nullopt, from_apex));
|
||||
parser.AddSectionParser(
|
||||
"service", std::make_unique<ServiceParser>(&service_list, GetSubcontext(), std::nullopt,
|
||||
from_apex));
|
||||
return parser;
|
||||
}
|
||||
|
||||
|
@ -783,7 +781,7 @@ int SecondStageMain(int argc, char** argv) {
|
|||
PLOG(FATAL) << "SetupMountNamespaces failed";
|
||||
}
|
||||
|
||||
subcontext = InitializeSubcontext();
|
||||
InitializeSubcontext();
|
||||
|
||||
ActionManager& am = ActionManager::GetInstance();
|
||||
ServiceList& sm = ServiceList::GetInstance();
|
||||
|
|
|
@ -52,6 +52,8 @@ namespace init {
|
|||
namespace {
|
||||
|
||||
std::string shutdown_command;
|
||||
static bool subcontext_terminated_by_shutdown;
|
||||
static std::unique_ptr<Subcontext> subcontext;
|
||||
|
||||
class SubcontextProcess {
|
||||
public:
|
||||
|
@ -323,34 +325,30 @@ Result<std::vector<std::string>> Subcontext::ExpandArgs(const std::vector<std::s
|
|||
return expanded_args;
|
||||
}
|
||||
|
||||
static std::vector<Subcontext> subcontexts;
|
||||
static bool shutting_down;
|
||||
|
||||
std::unique_ptr<Subcontext> InitializeSubcontext() {
|
||||
void InitializeSubcontext() {
|
||||
if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_P__) {
|
||||
return std::make_unique<Subcontext>(std::vector<std::string>{"/vendor", "/odm"},
|
||||
kVendorContext);
|
||||
subcontext.reset(
|
||||
new Subcontext(std::vector<std::string>{"/vendor", "/odm"}, kVendorContext));
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Subcontext* GetSubcontext() {
|
||||
return subcontext.get();
|
||||
}
|
||||
|
||||
bool SubcontextChildReap(pid_t pid) {
|
||||
for (auto& subcontext : subcontexts) {
|
||||
if (subcontext.pid() == pid) {
|
||||
if (!shutting_down) {
|
||||
subcontext.Restart();
|
||||
}
|
||||
return true;
|
||||
if (subcontext->pid() == pid) {
|
||||
if (!subcontext_terminated_by_shutdown) {
|
||||
subcontext->Restart();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void SubcontextTerminate() {
|
||||
shutting_down = true;
|
||||
for (auto& subcontext : subcontexts) {
|
||||
kill(subcontext.pid(), SIGTERM);
|
||||
}
|
||||
subcontext_terminated_by_shutdown = true;
|
||||
kill(subcontext->pid(), SIGTERM);
|
||||
}
|
||||
|
||||
} // namespace init
|
||||
|
|
|
@ -60,7 +60,8 @@ class Subcontext {
|
|||
};
|
||||
|
||||
int SubcontextMain(int argc, char** argv, const BuiltinFunctionMap* function_map);
|
||||
std::unique_ptr<Subcontext> InitializeSubcontext();
|
||||
void InitializeSubcontext();
|
||||
Subcontext* GetSubcontext();
|
||||
bool SubcontextChildReap(pid_t pid);
|
||||
void SubcontextTerminate();
|
||||
|
||||
|
|
Loading…
Reference in New Issue