#include #include #define LOG_TAG "Service" #include #include ServiceManager::ServiceManager() { } int ServiceManager::start(const char *name) { if (isRunning(name)) { LOGW("Service '%s' is already running", name); return 0; } LOGD("Starting service '%s'", name); property_set("ctl.start", name); int count = 200; while(count--) { sched_yield(); if (isRunning(name)) break; } if (!count) { LOGW("Timed out waiting for service '%s' to start", name); errno = ETIMEDOUT; return -1; } LOGD("Sucessfully started '%s'", name); return 0; } int ServiceManager::stop(const char *name) { if (!isRunning(name)) { LOGW("Service '%s' is already stopped", name); return 0; } LOGD("Stopping service '%s'", name); property_set("ctl.stop", name); int count = 200; while(count--) { sched_yield(); if (!isRunning(name)) break; } if (!count) { LOGW("Timed out waiting for service '%s' to stop", name); errno = ETIMEDOUT; return -1; } LOGD("Sucessfully stopped '%s'", name); return 0; } bool ServiceManager::isRunning(const char *name) { char propVal[PROPERTY_VALUE_MAX]; char propName[255]; snprintf(propName, sizeof(propVal), "init.svc.%s", name); if (property_get(propName, propVal, NULL)) { if (!strcmp(propVal, "running")) return true; } return false; }