diff options
Diffstat (limited to 'Source/WebKit/android/jni')
-rw-r--r-- | Source/WebKit/android/jni/JavaSharedClient.cpp | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/Source/WebKit/android/jni/JavaSharedClient.cpp b/Source/WebKit/android/jni/JavaSharedClient.cpp index 4f40355..4d073c2 100644 --- a/Source/WebKit/android/jni/JavaSharedClient.cpp +++ b/Source/WebKit/android/jni/JavaSharedClient.cpp @@ -88,12 +88,12 @@ namespace android { FileSystemClient* JavaSharedClient::gFileSystemClient = NULL; /////////////////////////////////////////////////////////////////////////// - + struct FuncPtrRec { void (*fProc)(void* payload); void* fPayload; }; - + static SkMutex gFuncPtrQMutex; static SkDeque gFuncPtrQ(sizeof(FuncPtrRec)); @@ -105,33 +105,34 @@ namespace android { FuncPtrRec* rec = (FuncPtrRec*)gFuncPtrQ.push_back(); rec->fProc = proc; rec->fPayload = payload; - + gFuncPtrQMutex.release(); - + gTimerClient->signalServiceFuncPtrQueue(); } void JavaSharedClient::ServiceFunctionPtrQueue() { - for (;;) { - void (*proc)(void*) = 0; - void* payload = 0; - const FuncPtrRec* rec; - - // we have to copy the proc/payload (if present). we do this so we - // don't call the proc inside the mutex (possible deadlock!) - gFuncPtrQMutex.acquire(); - rec = (const FuncPtrRec*)gFuncPtrQ.front(); - if (rec) { - proc = rec->fProc; - payload = rec->fPayload; - gFuncPtrQ.pop_front(); - } - gFuncPtrQMutex.release(); - - if (!rec) - break; - proc(payload); + // Don't let execution block the WebViewCore thread for too long. + void (*proc)(void*) = 0; + void* payload = 0; + const FuncPtrRec* rec; + + // we have to copy the proc/payload (if present). we do this so we + // don't call the proc inside the mutex (possible deadlock!) + gFuncPtrQMutex.acquire(); + rec = (const FuncPtrRec*)gFuncPtrQ.front(); + if (rec) { + proc = rec->fProc; + payload = rec->fPayload; + gFuncPtrQ.pop_front(); } + bool scheduleAdditionalCall = (gFuncPtrQ.count() > 0); + gFuncPtrQMutex.release(); + + if (rec) + proc(payload); + if (scheduleAdditionalCall) + gTimerClient->signalServiceFuncPtrQueue(); } } |