Merge changes from topic 'init-rc-breakup'
* changes: init: Queue Triggers instead of Actions bundle init.rc contents with its service
This commit is contained in:
commit
ff5be396d7
13 changed files with 142 additions and 46 deletions
|
|
@ -277,6 +277,8 @@ endif
|
||||||
|
|
||||||
LOCAL_MODULE := adbd
|
LOCAL_MODULE := adbd
|
||||||
|
|
||||||
|
LOCAL_INIT_RC := adbd.rc
|
||||||
|
|
||||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||||
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)
|
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)
|
||||||
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)
|
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)
|
||||||
|
|
|
||||||
14
adb/adbd.rc
Normal file
14
adb/adbd.rc
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
on post-fs-data
|
||||||
|
mkdir /data/misc/adb 02750 system shell
|
||||||
|
mkdir /data/adb 0700 root root
|
||||||
|
|
||||||
|
# adbd is controlled via property triggers in init.<platform>.usb.rc
|
||||||
|
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
|
||||||
|
class core
|
||||||
|
socket adbd stream 660 system system
|
||||||
|
disabled
|
||||||
|
seclabel u:r:adbd:s0
|
||||||
|
|
||||||
|
# adbd on at boot in emulator
|
||||||
|
on property:ro.kernel.qemu=1
|
||||||
|
start adbd
|
||||||
|
|
@ -27,6 +27,9 @@ LOCAL_SRC_FILES_x86_64 := x86_64/machine.cpp
|
||||||
|
|
||||||
LOCAL_CPPFLAGS := $(common_cppflags)
|
LOCAL_CPPFLAGS := $(common_cppflags)
|
||||||
|
|
||||||
|
LOCAL_INIT_RC_32 := debuggerd.rc
|
||||||
|
LOCAL_INIT_RC_64 := debuggerd64.rc
|
||||||
|
|
||||||
ifeq ($(TARGET_IS_64_BIT),true)
|
ifeq ($(TARGET_IS_64_BIT),true)
|
||||||
LOCAL_CPPFLAGS += -DTARGET_IS_64_BIT
|
LOCAL_CPPFLAGS += -DTARGET_IS_64_BIT
|
||||||
endif
|
endif
|
||||||
|
|
|
||||||
2
debuggerd/debuggerd.rc
Normal file
2
debuggerd/debuggerd.rc
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
service debuggerd /system/bin/debuggerd
|
||||||
|
class main
|
||||||
2
debuggerd/debuggerd64.rc
Normal file
2
debuggerd/debuggerd64.rc
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
service debuggerd64 /system/bin/debuggerd64
|
||||||
|
class main
|
||||||
120
init/action.cpp
120
init/action.cpp
|
|
@ -154,7 +154,7 @@ bool Action::InitTriggers(const std::vector<std::string>& args, std::string* err
|
||||||
const static std::string prop_str("property:");
|
const static std::string prop_str("property:");
|
||||||
for (std::size_t i = 0; i < args.size(); ++i) {
|
for (std::size_t i = 0; i < args.size(); ++i) {
|
||||||
if (i % 2) {
|
if (i % 2) {
|
||||||
if (args[i].compare("&&")) {
|
if (args[i] != "&&") {
|
||||||
*err = "&& is the only symbol allowed to concatenate actions";
|
*err = "&& is the only symbol allowed to concatenate actions";
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -189,24 +189,24 @@ bool Action::InitSingleTrigger(const std::string& trigger)
|
||||||
bool Action::CheckPropertyTriggers(const std::string& name,
|
bool Action::CheckPropertyTriggers(const std::string& name,
|
||||||
const std::string& value) const
|
const std::string& value) const
|
||||||
{
|
{
|
||||||
bool found = !name.compare("");
|
bool found = name.empty();
|
||||||
if (property_triggers_.empty()) {
|
if (property_triggers_.empty()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& t : property_triggers_) {
|
for (const auto& t : property_triggers_) {
|
||||||
if (!t.first.compare(name)) {
|
const auto& trigger_name = t.first;
|
||||||
if (t.second.compare("*") &&
|
const auto& trigger_value = t.second;
|
||||||
t.second.compare(value)) {
|
if (trigger_name == name) {
|
||||||
|
if (trigger_value != "*" && trigger_value != value) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::string prop_val = property_get(t.first.c_str());
|
std::string prop_val = property_get(trigger_name.c_str());
|
||||||
if (prop_val.empty() ||
|
if (prop_val.empty() || (trigger_value != "*" &&
|
||||||
(t.second.compare("*") &&
|
trigger_value != prop_val)) {
|
||||||
t.second.compare(prop_val))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -217,7 +217,7 @@ bool Action::CheckPropertyTriggers(const std::string& name,
|
||||||
bool Action::CheckEventTrigger(const std::string& trigger) const
|
bool Action::CheckEventTrigger(const std::string& trigger) const
|
||||||
{
|
{
|
||||||
return !event_trigger_.empty() &&
|
return !event_trigger_.empty() &&
|
||||||
!trigger.compare(event_trigger_) &&
|
trigger == event_trigger_ &&
|
||||||
CheckPropertyTriggers();
|
CheckPropertyTriggers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -229,10 +229,8 @@ bool Action::CheckPropertyTrigger(const std::string& name,
|
||||||
|
|
||||||
bool Action::TriggersEqual(const class Action& other) const
|
bool Action::TriggersEqual(const class Action& other) const
|
||||||
{
|
{
|
||||||
return property_triggers_.size() == other.property_triggers_.size() &&
|
return property_triggers_ == other.property_triggers_ &&
|
||||||
std::equal(property_triggers_.begin(), property_triggers_.end(),
|
event_trigger_ == other.event_trigger_;
|
||||||
other.property_triggers_.begin()) &&
|
|
||||||
!event_trigger_.compare(other.event_trigger_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Action::BuildTriggersString() const
|
std::string Action::BuildTriggersString() const
|
||||||
|
|
@ -255,19 +253,53 @@ std::string Action::BuildTriggersString() const
|
||||||
|
|
||||||
void Action::DumpState() const
|
void Action::DumpState() const
|
||||||
{
|
{
|
||||||
INFO("on ");
|
|
||||||
std::string trigger_name = BuildTriggersString();
|
std::string trigger_name = BuildTriggersString();
|
||||||
INFO("%s", trigger_name.c_str());
|
INFO("on %s\n", trigger_name.c_str());
|
||||||
INFO("\n");
|
|
||||||
|
|
||||||
for (const auto& c : commands_) {
|
for (const auto& c : commands_) {
|
||||||
std::string cmd_str = c->BuildCommandString();
|
std::string cmd_str = c->BuildCommandString();
|
||||||
INFO(" %s", cmd_str.c_str());
|
INFO(" %s\n", cmd_str.c_str());
|
||||||
}
|
}
|
||||||
INFO("\n");
|
INFO("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
ActionManager::ActionManager() : cur_command_(0)
|
|
||||||
|
class EventTrigger : public Trigger {
|
||||||
|
public:
|
||||||
|
EventTrigger(const std::string& trigger) : trigger_(trigger) {
|
||||||
|
}
|
||||||
|
bool CheckTriggers(const Action* action) override {
|
||||||
|
return action->CheckEventTrigger(trigger_);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::string trigger_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PropertyTrigger : public Trigger {
|
||||||
|
public:
|
||||||
|
PropertyTrigger(const std::string& name, const std::string& value)
|
||||||
|
: name_(name), value_(value) {
|
||||||
|
}
|
||||||
|
bool CheckTriggers(const Action* action) override {
|
||||||
|
return action->CheckPropertyTrigger(name_, value_);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::string name_;
|
||||||
|
std::string value_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BuiltinTrigger : public Trigger {
|
||||||
|
public:
|
||||||
|
BuiltinTrigger(Action* action) : action_(action) {
|
||||||
|
}
|
||||||
|
bool CheckTriggers(const Action* action) override {
|
||||||
|
return action == action_;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
Action* action_;
|
||||||
|
};
|
||||||
|
|
||||||
|
ActionManager::ActionManager() : current_command_(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -278,21 +310,13 @@ ActionManager& ActionManager::GetInstance() {
|
||||||
|
|
||||||
void ActionManager::QueueEventTrigger(const std::string& trigger)
|
void ActionManager::QueueEventTrigger(const std::string& trigger)
|
||||||
{
|
{
|
||||||
for (const auto& a : action_list_) {
|
trigger_queue_.push(std::make_unique<EventTrigger>(trigger));
|
||||||
if (a->CheckEventTrigger(trigger)) {
|
|
||||||
action_queue_.push(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActionManager::QueuePropertyTrigger(const std::string& name,
|
void ActionManager::QueuePropertyTrigger(const std::string& name,
|
||||||
const std::string& value)
|
const std::string& value)
|
||||||
{
|
{
|
||||||
for (const auto& a : action_list_) {
|
trigger_queue_.push(std::make_unique<PropertyTrigger>(name, value));
|
||||||
if (a->CheckPropertyTrigger(name, value)) {
|
|
||||||
action_queue_.push(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActionManager::QueueAllPropertyTriggers()
|
void ActionManager::QueueAllPropertyTriggers()
|
||||||
|
|
@ -312,35 +336,45 @@ void ActionManager::QueueBuiltinAction(int (*func)(const std::vector<std::string
|
||||||
|
|
||||||
act->AddCommand(func, name_vector);
|
act->AddCommand(func, name_vector);
|
||||||
|
|
||||||
action_queue_.push(act);
|
actions_.push_back(act);
|
||||||
|
trigger_queue_.push(std::make_unique<BuiltinTrigger>(act));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActionManager::ExecuteOneCommand() {
|
void ActionManager::ExecuteOneCommand() {
|
||||||
if (action_queue_.empty()) {
|
while (current_executing_actions_.empty() && !trigger_queue_.empty()) {
|
||||||
|
std::copy_if(actions_.begin(), actions_.end(),
|
||||||
|
std::back_inserter(current_executing_actions_),
|
||||||
|
[this] (Action* act) {
|
||||||
|
return trigger_queue_.front()->CheckTriggers(act);
|
||||||
|
});
|
||||||
|
trigger_queue_.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_executing_actions_.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Action* action = action_queue_.front();
|
Action* action = current_executing_actions_.back();
|
||||||
if (!action->NumCommands()) {
|
if (!action->NumCommands()) {
|
||||||
action_queue_.pop();
|
current_executing_actions_.pop_back();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur_command_ == 0) {
|
if (current_command_ == 0) {
|
||||||
std::string trigger_name = action->BuildTriggersString();
|
std::string trigger_name = action->BuildTriggersString();
|
||||||
INFO("processing action %p (%s)\n", action, trigger_name.c_str());
|
INFO("processing action %p (%s)\n", action, trigger_name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
action->ExecuteOneCommand(cur_command_++);
|
action->ExecuteOneCommand(current_command_++);
|
||||||
if (cur_command_ == action->NumCommands()) {
|
if (current_command_ == action->NumCommands()) {
|
||||||
cur_command_ = 0;
|
current_command_ = 0;
|
||||||
action_queue_.pop();
|
current_executing_actions_.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ActionManager::HasMoreCommands() const
|
bool ActionManager::HasMoreCommands() const
|
||||||
{
|
{
|
||||||
return !action_queue_.empty();
|
return !current_executing_actions_.empty() || !trigger_queue_.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Action* ActionManager::AddNewAction(const std::vector<std::string>& triggers,
|
Action* ActionManager::AddNewAction(const std::vector<std::string>& triggers,
|
||||||
|
|
@ -357,21 +391,21 @@ Action* ActionManager::AddNewAction(const std::vector<std::string>& triggers,
|
||||||
}
|
}
|
||||||
|
|
||||||
auto old_act_it =
|
auto old_act_it =
|
||||||
std::find_if(action_list_.begin(), action_list_.end(),
|
std::find_if(actions_.begin(), actions_.end(),
|
||||||
[&act] (Action* a) { return act->TriggersEqual(*a); });
|
[&act] (Action* a) { return act->TriggersEqual(*a); });
|
||||||
|
|
||||||
if (old_act_it != action_list_.end()) {
|
if (old_act_it != actions_.end()) {
|
||||||
delete act;
|
delete act;
|
||||||
return *old_act_it;
|
return *old_act_it;
|
||||||
}
|
}
|
||||||
|
|
||||||
action_list_.push_back(act);
|
actions_.push_back(act);
|
||||||
return act;
|
return act;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActionManager::DumpState() const
|
void ActionManager::DumpState() const
|
||||||
{
|
{
|
||||||
for (const auto& a : action_list_) {
|
for (const auto& a : actions_) {
|
||||||
a->DumpState();
|
a->DumpState();
|
||||||
}
|
}
|
||||||
INFO("\n");
|
INFO("\n");
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,12 @@ private:
|
||||||
std::vector<Command*> commands_;
|
std::vector<Command*> commands_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Trigger {
|
||||||
|
public:
|
||||||
|
virtual ~Trigger() { }
|
||||||
|
virtual bool CheckTriggers(const Action* action) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class ActionManager {
|
class ActionManager {
|
||||||
public:
|
public:
|
||||||
static ActionManager& GetInstance();
|
static ActionManager& GetInstance();
|
||||||
|
|
@ -74,9 +80,10 @@ private:
|
||||||
ActionManager(ActionManager const&) = delete;
|
ActionManager(ActionManager const&) = delete;
|
||||||
void operator=(ActionManager const&) = delete;
|
void operator=(ActionManager const&) = delete;
|
||||||
|
|
||||||
std::vector<Action*> action_list_;
|
std::vector<Action*> actions_;
|
||||||
std::queue<Action*> action_queue_;
|
std::queue<std::unique_ptr<Trigger>> trigger_queue_;
|
||||||
std::size_t cur_command_;
|
std::vector<Action*> current_executing_actions_;
|
||||||
|
std::size_t current_command_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,6 @@ LOCAL_CFLAGS := -Werror
|
||||||
|
|
||||||
LOCAL_MODULE := lmkd
|
LOCAL_MODULE := lmkd
|
||||||
|
|
||||||
|
LOCAL_INIT_RC := lmkd.rc
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
|
||||||
4
lmkd/lmkd.rc
Normal file
4
lmkd/lmkd.rc
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
service lmkd /system/bin/lmkd
|
||||||
|
class core
|
||||||
|
critical
|
||||||
|
socket lmkd seqpacket 0660 system system
|
||||||
|
|
@ -11,6 +11,8 @@ LOCAL_MODULE := logcat
|
||||||
|
|
||||||
LOCAL_CFLAGS := -Werror
|
LOCAL_CFLAGS := -Werror
|
||||||
|
|
||||||
|
LOCAL_INIT_RC := logcatd.rc
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
||||||
include $(call first-makefiles-under,$(LOCAL_PATH))
|
include $(call first-makefiles-under,$(LOCAL_PATH))
|
||||||
|
|
|
||||||
13
logcat/logcatd.rc
Normal file
13
logcat/logcatd.rc
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
on property:persist.logd.logpersistd=logcatd
|
||||||
|
# all exec/services are called with umask(077), so no gain beyond 0700
|
||||||
|
mkdir /data/misc/logd 0700 logd log
|
||||||
|
# logd for write to /data/misc/logd, log group for read from pstore (-L)
|
||||||
|
exec - logd log -- /system/bin/logcat -L -b all -v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 64 -n 256
|
||||||
|
start logcatd
|
||||||
|
|
||||||
|
service logcatd /system/bin/logcat -b all -v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 64 -n 256
|
||||||
|
class late_start
|
||||||
|
disabled
|
||||||
|
# logd for write to /data/misc/logd, log group for read from log daemon
|
||||||
|
user logd
|
||||||
|
group log
|
||||||
|
|
@ -4,6 +4,8 @@ include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_MODULE:= logd
|
LOCAL_MODULE:= logd
|
||||||
|
|
||||||
|
LOCAL_INIT_RC := logd.rc
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
LogCommand.cpp \
|
LogCommand.cpp \
|
||||||
|
|
|
||||||
9
logd/logd.rc
Normal file
9
logd/logd.rc
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
service logd /system/bin/logd
|
||||||
|
class core
|
||||||
|
socket logd stream 0666 logd logd
|
||||||
|
socket logdr seqpacket 0666 logd logd
|
||||||
|
socket logdw dgram 0222 logd logd
|
||||||
|
|
||||||
|
service logd-reinit /system/bin/logd --reinit
|
||||||
|
oneshot
|
||||||
|
disabled
|
||||||
Loading…
Add table
Reference in a new issue