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