Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3e43b38 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

rename binder services main thread to Binder_*

When a binder service's main thread joins the thread pool
it retains its name (whatever the exec name was), which is
very confusing in systrace.

we now rename that thread just like its friends in the
thread pool.

Change-Id: Ibb3b6ff07304b247cfc6fb1694e72350c579513e
parent 649b976a
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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();
    }

+2 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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,
+14 −5
Original line number Diff line number Diff line
@@ -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);
+22 −18
Original line number Diff line number Diff line
@@ -109,11 +109,19 @@ struct thread_data_t {
        }
        
        if (name) {
            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;
            char *s = name;
    const char *s = name;
    while (*s) {
        if (*s == '.') hasDot = 1;
        else if (*s == '@') hasAt = 1;
@@ -127,11 +135,7 @@ struct thread_data_t {
    }
    prctl(PR_SET_NAME, (unsigned long) s, 0, 0, 0);
#endif
            free(name);
}
        return f(u);
    }
};

int androidCreateRawThreadEtc(android_thread_func_t entryFunction,
                               void *userData,