From 173247db5500c88f7a7229fd20fb49ebd2d49296 Mon Sep 17 00:00:00 2001 From: Patrick Scott Date: Tue, 28 Jul 2009 14:44:16 -0400 Subject: Do not merge. This will attach and detach the native thread to and from the java vm. I believe this was the cause of a crash in donut. Sometimes, the IconDatabase needs to notify the WebCore thread of a new Icon. These callbacks post messages through the vm which causes AttachCurrentThread to be called but no matching DetachCurrentThread when the thread exits. Bug:1977972 --- JavaScriptCore/wtf/ThreadingPthreads.cpp | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'JavaScriptCore/wtf/ThreadingPthreads.cpp') diff --git a/JavaScriptCore/wtf/ThreadingPthreads.cpp b/JavaScriptCore/wtf/ThreadingPthreads.cpp index 105e42a..8a2c943 100644 --- a/JavaScriptCore/wtf/ThreadingPthreads.cpp +++ b/JavaScriptCore/wtf/ThreadingPthreads.cpp @@ -42,6 +42,10 @@ #include #include +#if PLATFORM(ANDROID) +#include "jni_utility.h" +#endif + namespace WTF { typedef HashMap ThreadMap; @@ -130,6 +134,42 @@ static void clearPthreadHandleForIdentifier(ThreadIdentifier id) threadMap().remove(id); } +#if PLATFORM(ANDROID) +// On the Android platform, threads must be registered with the VM before they run. +struct ThreadData { + ThreadFunction entryPoint; + void* arg; +}; + +static void* runThreadWithRegistration(void* arg) +{ + ThreadData* data = static_cast(arg); + JavaVM* vm = JSC::Bindings::getJavaVM(); + JNIEnv* env; + void* ret = 0; + if (vm->AttachCurrentThread(&env, 0) == JNI_OK) { + ret = data->entryPoint(data->arg); + vm->DetachCurrentThread(); + } + delete data; + return ret; +} + +ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*) +{ + pthread_t threadHandle; + ThreadData* threadData = new ThreadData; + threadData->entryPoint = entryPoint; + threadData->arg = data; + + if (pthread_create(&threadHandle, 0, runThreadWithRegistration, static_cast(threadData))) { + LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data); + delete threadData; + return 0; + } + return establishIdentifierForPthreadHandle(threadHandle); +} +#else ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*) { pthread_t threadHandle; @@ -140,6 +180,7 @@ ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, con return establishIdentifierForPthreadHandle(threadHandle); } +#endif int waitForThreadCompletion(ThreadIdentifier threadID, void** result) { -- cgit v1.1