From e16986cae281f118ecd563c384b7f6e5a4b937b5 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Fri, 8 Jul 2011 18:52:57 -0700 Subject: [PATCH] Eliminate single-process mode. Bug: 5010576 Change-Id: Id450dc83efed4897d1e4ff451530fed14457aace --- cmds/runtime/main_runtime.cpp | 85 +++++++++-------------------------- include/binder/ProcessState.h | 4 -- libs/binder/ProcessState.cpp | 51 +++++---------------- 3 files changed, 33 insertions(+), 107 deletions(-) diff --git a/cmds/runtime/main_runtime.cpp b/cmds/runtime/main_runtime.cpp index dbff095f6..e3b72c264 100644 --- a/cmds/runtime/main_runtime.cpp +++ b/cmds/runtime/main_runtime.cpp @@ -93,12 +93,11 @@ extern void QuickTests(); static void usage(const char* argv0) { fprintf(stderr, - "Usage: runtime [-g gamma] [-l logfile] [-n] [-s]\n" + "Usage: runtime [-g gamma] [-l logfile] [-n]\n" " [-j app-component] [-v app-verb] [-d app-data]\n" "\n" "-l: File to send log messages to\n" "-n: Don't print to stdout/stderr\n" - "-s: Force single-process mode\n" "-j: Custom home app component name\n" "-v: Custom home app intent verb\n" "-d: Custom home app intent data\n" @@ -145,21 +144,14 @@ static int run(sp& proc) LOGI("run() sending FIRST_CALL_TRANSACTION to activity manager"); am->transact(IBinder::FIRST_CALL_TRANSACTION, data, &reply); - if (proc->supportsProcesses()) { - // Now we link to the Activity Manager waiting for it to die. If it does kill ourself. - // initd will restart this process and bring the system back up. - sp grim = new GrimReaper(); - am->linkToDeath(grim, grim.get(), 0); + // Now we link to the Activity Manager waiting for it to die. If it does kill ourself. + // initd will restart this process and bring the system back up. + sp grim = new GrimReaper(); + am->linkToDeath(grim, grim.get(), 0); - // Now join the thread pool. Note this is needed so that the message enqueued in the driver - // for the linkToDeath gets processed. - IPCThreadState::self()->joinThreadPool(); - } else { - // Keep this thread running forever... - while (1) { - usleep(100000); - } - } + // Now join the thread pool. Note this is needed so that the message enqueued in the driver + // for the linkToDeath gets processed. + IPCThreadState::self()->joinThreadPool(); return 1; } @@ -179,14 +171,7 @@ LOGI("run() sending FIRST_CALL_TRANSACTION to activity manager"); */ static void finish_system_init(sp& proc) { - // If we are running multiprocess, we now need to have the - // thread pool started here. We don't do this in boot_init() - // because when running single process we need to start the - // thread pool after the Android runtime has been started (so - // the pool uses Dalvik threads). - if (proc->supportsProcesses()) { - proc->startThreadPool(); - } + proc->startThreadPool(); } @@ -214,11 +199,7 @@ static void boot_init() LOGD("ProcessState: %p\n", proc.get()); proc->becomeContextManager(contextChecker, NULL); - if (proc->supportsProcesses()) { - LOGI("Binder driver opened. Multiprocess enabled.\n"); - } else { - LOGI("Binder driver not found. Processes not supported.\n"); - } + LOGI("Binder driver opened.\n"); sp sm = new BServiceManager; proc->setContextObject(sm); @@ -340,7 +321,6 @@ static status_t start_process(const char* name) extern "C" int main(int argc, char* const argv[]) { - bool singleProcess = false; const char* logFile = NULL; int ic; int result = 1; @@ -359,7 +339,7 @@ int main(int argc, char* const argv[]) #endif while (1) { - ic = getopt(argc, argv, "g:j:v:d:l:ns"); + ic = getopt(argc, argv, "g:j:v:d:l:n"); if (ic < 0) break; @@ -381,9 +361,6 @@ int main(int argc, char* const argv[]) case 'n': redirectStdFds(); break; - case 's': - singleProcess = true; - break; case '?': default: LOGE("runtime: unrecognized flag -%c\n", ic); @@ -396,10 +373,6 @@ int main(int argc, char* const argv[]) usage(argv[0]); } - if (singleProcess) { - ProcessState::setSingleProcess(true); - } - if (logFile != NULL) { android_logToFile(NULL, logFile); } @@ -475,33 +448,17 @@ int main(int argc, char* const argv[]) boot_init(); - /* If we are in multiprocess mode, have zygote spawn the system - * server process and call system_init(). If we are running in - * single process mode just call system_init() directly. - */ - if (proc->supportsProcesses()) { - // If stdio logging is on, system_server should not inherit our stdio - // The dalvikvm instance will copy stdio to the log on its own - char propBuf[PROPERTY_VALUE_MAX]; - bool logStdio = false; - property_get("log.redirect-stdio", propBuf, ""); - logStdio = (strcmp(propBuf, "true") == 0); + // Have zygote spawn the system server process and call system_init(). + // If stdio logging is on, system_server should not inherit our stdio + // The dalvikvm instance will copy stdio to the log on its own + char propBuf[PROPERTY_VALUE_MAX]; + bool logStdio = false; + property_get("log.redirect-stdio", propBuf, ""); + logStdio = (strcmp(propBuf, "true") == 0); - zygote_run_oneshot((int)(!logStdio), - sizeof(ZYGOTE_ARGV) / sizeof(ZYGOTE_ARGV[0]), - ZYGOTE_ARGV); - - //start_process("/system/bin/mediaserver"); - - } else { -#ifndef HAVE_ANDROID_OS - QuickRuntime* runt = new QuickRuntime(); - runt->start("com/android/server/SystemServer", - "" /* spontaneously fork system server from zygote */); -#endif - } - - //printf("+++ post-zygote\n"); + zygote_run_oneshot((int)(!logStdio), + sizeof(ZYGOTE_ARGV) / sizeof(ZYGOTE_ARGV[0]), + ZYGOTE_ARGV); finish_system_init(proc); run(proc); diff --git a/include/binder/ProcessState.h b/include/binder/ProcessState.h index feeb3c389..9725822ea 100644 --- a/include/binder/ProcessState.h +++ b/include/binder/ProcessState.h @@ -39,8 +39,6 @@ class ProcessState : public virtual RefBase public: static sp self(); - static void setSingleProcess(bool singleProcess); - void setContextObject(const sp& object); sp getContextObject(const sp& caller); @@ -48,8 +46,6 @@ public: const String16& name); sp getContextObject(const String16& name, const sp& caller); - - bool supportsProcesses() const; void startThreadPool(); diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index 2d4e10ddd..7264ac408 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -43,8 +43,6 @@ #define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2)) -static bool gSingleProcess = false; - // --------------------------------------------------------------------------- @@ -82,12 +80,6 @@ sp ProcessState::self() return gProcess; } -void ProcessState::setSingleProcess(bool singleProcess) -{ - gSingleProcess = singleProcess; -} - - void ProcessState::setContextObject(const sp& object) { setContextObject(object, String16("default")); @@ -95,11 +87,7 @@ void ProcessState::setContextObject(const sp& object) sp ProcessState::getContextObject(const sp& caller) { - if (supportsProcesses()) { - return getStrongProxyForHandle(0); - } else { - return getContextObject(String16("default"), caller); - } + return getStrongProxyForHandle(0); } void ProcessState::setContextObject(const sp& object, const String16& name) @@ -144,11 +132,6 @@ sp ProcessState::getContextObject(const String16& name, const sp= 0; -} - void ProcessState::startThreadPool() { AutoMutex _l(mLock); @@ -169,24 +152,19 @@ bool ProcessState::becomeContextManager(context_check_func checkFunc, void* user AutoMutex _l(mLock); mBinderContextCheckFunc = checkFunc; mBinderContextUserData = userData; - if (mDriverFD >= 0) { - int dummy = 0; + + int dummy = 0; #if defined(HAVE_ANDROID_OS) - status_t result = ioctl(mDriverFD, BINDER_SET_CONTEXT_MGR, &dummy); + status_t result = ioctl(mDriverFD, BINDER_SET_CONTEXT_MGR, &dummy); #else - status_t result = INVALID_OPERATION; + status_t result = INVALID_OPERATION; #endif - if (result == 0) { - mManagesContexts = true; - } else if (result == -1) { - mBinderContextCheckFunc = NULL; - mBinderContextUserData = NULL; - LOGE("Binder ioctl to become context manager failed: %s\n", strerror(errno)); - } - } else { - // If there is no driver, our only world is the local - // process so we can always become the context manager there. + if (result == 0) { mManagesContexts = true; + } else if (result == -1) { + mBinderContextCheckFunc = NULL; + mBinderContextUserData = NULL; + LOGE("Binder ioctl to become context manager failed: %s\n", strerror(errno)); } } return mManagesContexts; @@ -322,10 +300,6 @@ void ProcessState::spawnPooledThread(bool isMain) static int open_driver() { - if (gSingleProcess) { - return -1; - } - int fd = open("/dev/binder", O_RDWR); if (fd >= 0) { fcntl(fd, F_SETFD, FD_CLOEXEC); @@ -386,9 +360,8 @@ ProcessState::ProcessState() mDriverFD = -1; #endif } - if (mDriverFD < 0) { - // Need to run without the driver, starting our own thread pool. - } + + LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened. Terminating."); } ProcessState::~ProcessState()