diff options
Diffstat (limited to 'cmds/system_server/library/system_init.cpp')
-rw-r--r-- | cmds/system_server/library/system_init.cpp | 109 |
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; +} + |