diff options
author | 2013-03-08 20:31:57 +0000 | |
---|---|---|
committer | 2013-03-08 20:31:57 +0000 | |
commit | 336dda6b9303d7dcf7ee3ddda3cd8cb3b8305788 (patch) | |
tree | 42e1b0450f91ade79d4a6e894af7ab83b3541486 | |
parent | 96a63c68433b04937a259dd568ded3e6d9a346d5 (diff) | |
parent | 3f27f9503356f8f60246dd188c4dd899e8999150 (diff) |
am 3f27f950: am 6b2b7009: Merge changes Ibb3b6ff0,I2341e20c into jb-mr2-dev
* commit '3f27f9503356f8f60246dd188c4dd899e8999150':
rename binder services main thread to Binder_*
limit number of extra binder threads in SF to 4
-rw-r--r-- | cmds/surfaceflinger/main_surfaceflinger.cpp | 2 | ||||
-rw-r--r-- | include/binder/BinderService.h | 9 | ||||
-rw-r--r-- | include/binder/ProcessState.h | 2 | ||||
-rw-r--r-- | include/utils/AndroidThreads.h | 3 | ||||
-rw-r--r-- | libs/binder/ProcessState.cpp | 19 | ||||
-rw-r--r-- | libs/utils/Threads.cpp | 40 |
6 files changed, 49 insertions, 26 deletions
diff --git a/cmds/surfaceflinger/main_surfaceflinger.cpp b/cmds/surfaceflinger/main_surfaceflinger.cpp index 28e58e4b9e..ce7fde0b64 100644 --- a/cmds/surfaceflinger/main_surfaceflinger.cpp +++ b/cmds/surfaceflinger/main_surfaceflinger.cpp @@ -20,9 +20,9 @@ using namespace android; int main(int argc, char** argv) { - SurfaceFlinger::publishAndJoinThreadPool(true); // When SF is launched in its own process, limit the number of // binder threads to 4. ProcessState::self()->setThreadPoolMaxThreadCount(4); + SurfaceFlinger::publishAndJoinThreadPool(true); return 0; } diff --git a/include/binder/BinderService.h b/include/binder/BinderService.h index 646026841d..5ac36d901e 100644 --- a/include/binder/BinderService.h +++ b/include/binder/BinderService.h @@ -36,13 +36,18 @@ class BinderService public: static status_t publish(bool allowIsolated = false) { sp<IServiceManager> sm(defaultServiceManager()); - return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated); + return sm->addService( + String16(SERVICE::getServiceName()), + new SERVICE(), allowIsolated); } static void publishAndJoinThreadPool(bool allowIsolated = false) { sp<IServiceManager> sm(defaultServiceManager()); - sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated); + sm->addService( + String16(SERVICE::getServiceName()), + new SERVICE(), allowIsolated); ProcessState::self()->startThreadPool(); + ProcessState::self()->giveThreadPoolName(); IPCThreadState::self()->joinThreadPool(); } diff --git a/include/binder/ProcessState.h b/include/binder/ProcessState.h index 8caf1afedf..e63a0d0b2a 100644 --- a/include/binder/ProcessState.h +++ b/include/binder/ProcessState.h @@ -71,6 +71,7 @@ public: void spawnPooledThread(bool isMain); status_t setThreadPoolMaxThreadCount(size_t maxThreads); + void giveThreadPoolName(); private: friend class IPCThreadState; @@ -80,6 +81,7 @@ private: ProcessState(const ProcessState& o); ProcessState& operator=(const ProcessState& o); + String8 makeBinderThreadName(); struct handle_entry { IBinder* binder; diff --git a/include/utils/AndroidThreads.h b/include/utils/AndroidThreads.h index f67648fd62..4eee14d7e0 100644 --- a/include/utils/AndroidThreads.h +++ b/include/utils/AndroidThreads.h @@ -56,6 +56,9 @@ extern int androidCreateRawThreadEtc(android_thread_func_t entryFunction, size_t threadStackSize, android_thread_id_t *threadId); +// set the same of the running thread +extern void androidSetThreadName(const char* name); + // Used by the Java Runtime to control how threads are created, so that // they can be proper and lovely Java threads. typedef int (*android_create_thread_fn)(android_thread_func_t entryFunction, diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index d95fd6fa93..294e1d4898 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -283,15 +283,20 @@ void ProcessState::setArgV0(const char* txt) } } +String8 ProcessState::makeBinderThreadName() { + int32_t s = android_atomic_add(1, &mThreadPoolSeq); + String8 name; + name.appendFormat("Binder_%X", s); + return name; +} + void ProcessState::spawnPooledThread(bool isMain) { if (mThreadPoolStarted) { - int32_t s = android_atomic_add(1, &mThreadPoolSeq); - char buf[16]; - snprintf(buf, sizeof(buf), "Binder_%X", s); - ALOGV("Spawning new pooled thread, name=%s\n", buf); + String8 name = makeBinderThreadName(); + ALOGV("Spawning new pooled thread, name=%s\n", name.string()); sp<Thread> t = new PoolThread(isMain); - t->run(buf); + t->run(name.string()); } } @@ -304,6 +309,10 @@ status_t ProcessState::setThreadPoolMaxThreadCount(size_t maxThreads) { return result; } +void ProcessState::giveThreadPoolName() { + androidSetThreadName( makeBinderThreadName().string() ); +} + static int open_driver() { int fd = open("/dev/binder", O_RDWR); diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp index f201fc7447..cbf4ef628c 100644 --- a/libs/utils/Threads.cpp +++ b/libs/utils/Threads.cpp @@ -90,30 +90,34 @@ struct thread_data_t { } if (name) { -#if defined(HAVE_PRCTL) - // Mac OS doesn't have this, and we build libutil for the host too - int hasAt = 0; - int hasDot = 0; - char *s = name; - while (*s) { - if (*s == '.') hasDot = 1; - else if (*s == '@') hasAt = 1; - s++; - } - int len = s - name; - if (len < 15 || hasAt || !hasDot) { - s = name; - } else { - s = name + len - 15; - } - prctl(PR_SET_NAME, (unsigned long) s, 0, 0, 0); -#endif + androidSetThreadName(name); free(name); } return f(u); } }; +void androidSetThreadName(const char* name) { +#if defined(HAVE_PRCTL) + // Mac OS doesn't have this, and we build libutil for the host too + int hasAt = 0; + int hasDot = 0; + const char *s = name; + while (*s) { + if (*s == '.') hasDot = 1; + else if (*s == '@') hasAt = 1; + s++; + } + int len = s - name; + if (len < 15 || hasAt || !hasDot) { + s = name; + } else { + s = name + len - 15; + } + prctl(PR_SET_NAME, (unsigned long) s, 0, 0, 0); +#endif +} + int androidCreateRawThreadEtc(android_thread_func_t entryFunction, void *userData, const char* threadName, |