diff options
Diffstat (limited to 'Source/WebKit/android/jni/JavaSharedClient.cpp')
-rw-r--r-- | Source/WebKit/android/jni/JavaSharedClient.cpp | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/Source/WebKit/android/jni/JavaSharedClient.cpp b/Source/WebKit/android/jni/JavaSharedClient.cpp index 4d073c2..4f40355 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,34 +105,33 @@ namespace android { FuncPtrRec* rec = (FuncPtrRec*)gFuncPtrQ.push_back(); rec->fProc = proc; rec->fPayload = payload; - + gFuncPtrQMutex.release(); - + gTimerClient->signalServiceFuncPtrQueue(); } void JavaSharedClient::ServiceFunctionPtrQueue() { - // 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) + 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); - if (scheduleAdditionalCall) - gTimerClient->signalServiceFuncPtrQueue(); + } } } |