Merge changes Ibb3b6ff0,I2341e20c into jb-mr2-dev

* changes:
  rename binder services main thread to Binder_*
  limit number of extra binder threads in SF to 4
This commit is contained in:
Mathias Agopian 2013-03-08 20:28:42 +00:00 committed by Android (Google) Code Review
commit 6b2b700956
6 changed files with 49 additions and 26 deletions

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -109,30 +109,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,