summaryrefslogtreecommitdiffstats
path: root/cmds/system_server/library/system_init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/system_server/library/system_init.cpp')
-rw-r--r--cmds/system_server/library/system_init.cpp109
1 files changed, 109 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 0000000..73b23e2
--- /dev/null
+++ b/cmds/system_server/library/system_init.cpp
@@ -0,0 +1,109 @@
+/*
+ * 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 <utils/IPCThreadState.h>
+#include <utils/ProcessState.h>
+#include <utils/IServiceManager.h>
+#include <utils/TextOutput.h>
+#include <utils/Log.h>
+
+#include <SurfaceFlinger.h>
+#include <AudioFlinger.h>
+#include <CameraService.h>
+#include <MediaPlayerService.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)
+ {
+ LOGI("Grim Reaper killing system_server...");
+ kill(getpid(), SIGKILL);
+ }
+};
+
+} // namespace android
+
+
+
+extern "C" status_t system_init()
+{
+ LOGI("Entered system_init()");
+
+ sp<ProcessState> proc(ProcessState::self());
+
+ sp<IServiceManager> sm = defaultServiceManager();
+ LOGI("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();
+ }
+
+ // On the simulator, audioflinger et al don't get started the
+ // same way as on the device, and we need to start them here
+ if (!proc->supportsProcesses()) {
+
+ // Start the AudioFlinger
+ AudioFlinger::instantiate();
+
+ // Start the media playback service
+ MediaPlayerService::instantiate();
+
+ // Start the camera service
+ CameraService::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.
+ LOGI("System server: starting Android runtime.\n");
+
+ AndroidRuntime* runtime = AndroidRuntime::getRuntime();
+
+ LOGI("System server: starting Android services.\n");
+ runtime->callStatic("com/android/server/SystemServer", "init2");
+
+ // If running in our own process, just go into the thread
+ // pool. Otherwise, call the initialization finished
+ // func to let this process continue its initilization.
+ if (proc->supportsProcesses()) {
+ LOGI("System server: entering thread pool.\n");
+ ProcessState::self()->startThreadPool();
+ IPCThreadState::self()->joinThreadPool();
+ LOGI("System server: exiting thread pool.\n");
+ }
+ return NO_ERROR;
+}
+