#include <errno.h> #include <sysutils/ServiceManager.h> #define LOG_TAG "Service" #include <cutils/log.h> #include <cutils/properties.h> ServiceManager::ServiceManager() { } int ServiceManager::start(const char *name) { if (isRunning(name)) { SLOGW("Service '%s' is already running", name); return 0; } SLOGD("Starting service '%s'", name); property_set("ctl.start", name); int count = 200; while(count--) { sched_yield(); if (isRunning(name)) break; } if (!count) { SLOGW("Timed out waiting for service '%s' to start", name); errno = ETIMEDOUT; return -1; } SLOGD("Sucessfully started '%s'", name); return 0; } int ServiceManager::stop(const char *name) { if (!isRunning(name)) { SLOGW("Service '%s' is already stopped", name); return 0; } SLOGD("Stopping service '%s'", name); property_set("ctl.stop", name); int count = 200; while(count--) { sched_yield(); if (!isRunning(name)) break; } if (!count) { SLOGW("Timed out waiting for service '%s' to stop", name); errno = ETIMEDOUT; return -1; } SLOGD("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; }