ServiceManager.cpp revision 7e8529a8b528fd30586aa037f15a31b29582c537
1#include <errno.h> 2 3#include <sysutils/ServiceManager.h> 4 5#define LOG_TAG "Service" 6#include <cutils/log.h> 7#include <cutils/properties.h> 8 9ServiceManager::ServiceManager() { 10} 11 12int ServiceManager::start(const char *name) { 13 if (isRunning(name)) { 14 SLOGW("Service '%s' is already running", name); 15 return 0; 16 } 17 18 SLOGD("Starting service '%s'", name); 19 property_set("ctl.start", name); 20 21 int count = 200; 22 while(count--) { 23 sched_yield(); 24 if (isRunning(name)) 25 break; 26 } 27 if (!count) { 28 SLOGW("Timed out waiting for service '%s' to start", name); 29 errno = ETIMEDOUT; 30 return -1; 31 } 32 SLOGD("Sucessfully started '%s'", name); 33 return 0; 34} 35 36int ServiceManager::stop(const char *name) { 37 if (!isRunning(name)) { 38 SLOGW("Service '%s' is already stopped", name); 39 return 0; 40 } 41 42 SLOGD("Stopping service '%s'", name); 43 property_set("ctl.stop", name); 44 45 int count = 200; 46 while(count--) { 47 sched_yield(); 48 if (!isRunning(name)) 49 break; 50 } 51 52 if (!count) { 53 SLOGW("Timed out waiting for service '%s' to stop", name); 54 errno = ETIMEDOUT; 55 return -1; 56 } 57 SLOGD("Sucessfully stopped '%s'", name); 58 return 0; 59} 60 61bool ServiceManager::isRunning(const char *name) { 62 char propVal[PROPERTY_VALUE_MAX]; 63 char propName[255]; 64 65 snprintf(propName, sizeof(propVal), "init.svc.%s", name); 66 67 68 if (property_get(propName, propVal, NULL)) { 69 if (!strcmp(propVal, "running")) 70 return true; 71 } 72 return false; 73} 74