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:
commit
6b2b700956
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user