diff options
author | Mike Lockwood <lockwood@google.com> | 2012-10-24 11:52:57 -0700 |
---|---|---|
committer | Mike Lockwood <lockwood@google.com> | 2012-10-24 11:52:57 -0700 |
commit | e0e9e9462c8035c1883a0bd16ee62d861c77e550 (patch) | |
tree | 14e4d765ef53bd36e80d6a75a8a6991533ca2ded /cmds/system_server/library/system_init.cpp | |
parent | 6931061de6471e598d36e6c101ce9bb95036a80c (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.cpp | 105 |
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; +} |