summaryrefslogtreecommitdiff
path: root/cmds/system_server/library/system_init.cpp
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@google.com>2012-10-24 11:52:57 -0700
committerMike Lockwood <lockwood@google.com>2012-10-24 11:52:57 -0700
commite0e9e9462c8035c1883a0bd16ee62d861c77e550 (patch)
tree14e4d765ef53bd36e80d6a75a8a6991533ca2ded /cmds/system_server/library/system_init.cpp
parent6931061de6471e598d36e6c101ce9bb95036a80c (diff)
Move app_process and system_server back to frameworks/base
due to dependency on libandroid_runtime Change-Id: I96c0ba72ea406c9e7e63b9a160498187b6ec9b21 Signed-off-by: Mike Lockwood <lockwood@google.com>
Diffstat (limited to 'cmds/system_server/library/system_init.cpp')
-rw-r--r--cmds/system_server/library/system_init.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/cmds/system_server/library/system_init.cpp b/cmds/system_server/library/system_init.cpp
new file mode 100644
index 000000000000..745c34a0478c
--- /dev/null
+++ b/cmds/system_server/library/system_init.cpp
@@ -0,0 +1,105 @@
+/*
+ * System server main initialization.
+ *
+ * The system server is responsible for becoming the Binder
+ * context manager, supplying the root ServiceManager object
+ * through which other services can be found.
+ */
+
+#define LOG_TAG "sysproc"
+
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
+#include <utils/TextOutput.h>
+#include <utils/Log.h>
+
+#include <SurfaceFlinger.h>
+#include <SensorService.h>
+
+#include <android_runtime/AndroidRuntime.h>
+
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <cutils/properties.h>
+
+using namespace android;
+
+namespace android {
+/**
+ * This class is used to kill this process when the runtime dies.
+ */
+class GrimReaper : public IBinder::DeathRecipient {
+public:
+ GrimReaper() { }
+
+ virtual void binderDied(const wp<IBinder>& who)
+ {
+ ALOGI("Grim Reaper killing system_server...");
+ kill(getpid(), SIGKILL);
+ }
+};
+
+} // namespace android
+
+
+
+extern "C" status_t system_init()
+{
+ ALOGI("Entered system_init()");
+
+ sp<ProcessState> proc(ProcessState::self());
+
+ sp<IServiceManager> sm = defaultServiceManager();
+ ALOGI("ServiceManager: %p\n", sm.get());
+
+ sp<GrimReaper> grim = new GrimReaper();
+ sm->asBinder()->linkToDeath(grim, grim.get(), 0);
+
+ char propBuf[PROPERTY_VALUE_MAX];
+ property_get("system_init.startsurfaceflinger", propBuf, "1");
+ if (strcmp(propBuf, "1") == 0) {
+ // Start the SurfaceFlinger
+ SurfaceFlinger::instantiate();
+ }
+
+ property_get("system_init.startsensorservice", propBuf, "1");
+ if (strcmp(propBuf, "1") == 0) {
+ // Start the sensor service
+ SensorService::instantiate();
+ }
+
+ // And now start the Android runtime. We have to do this bit
+ // of nastiness because the Android runtime initialization requires
+ // some of the core system services to already be started.
+ // All other servers should just start the Android runtime at
+ // the beginning of their processes's main(), before calling
+ // the init function.
+ ALOGI("System server: starting Android runtime.\n");
+ AndroidRuntime* runtime = AndroidRuntime::getRuntime();
+
+ ALOGI("System server: starting Android services.\n");
+ JNIEnv* env = runtime->getJNIEnv();
+ if (env == NULL) {
+ return UNKNOWN_ERROR;
+ }
+ jclass clazz = env->FindClass("com/android/server/SystemServer");
+ if (clazz == NULL) {
+ return UNKNOWN_ERROR;
+ }
+ jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
+ if (methodId == NULL) {
+ return UNKNOWN_ERROR;
+ }
+ env->CallStaticVoidMethod(clazz, methodId);
+
+ ALOGI("System server: entering thread pool.\n");
+ ProcessState::self()->startThreadPool();
+ IPCThreadState::self()->joinThreadPool();
+ ALOGI("System server: exiting thread pool.\n");
+
+ return NO_ERROR;
+}