18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 277b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch#include "FileSystemClient.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JavaSharedClient.h" 291da4c23e4d3bab3ac6655659ea441f46f28cf485Patrick Scott#include "TimerClient.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDeque.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkThread.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimerClient* JavaSharedClient::GetTimerClient() 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return gTimerClient; 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CookieClient* JavaSharedClient::GetCookieClient() 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return gCookieClient; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4464bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba PluginClient* JavaSharedClient::GetPluginClient() 4564bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba { 4664bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba return gPluginClient; 4764bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba } 4864bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba 4902f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba KeyGeneratorClient* JavaSharedClient::GetKeyGeneratorClient() 5002f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba { 5102f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba return gKeyGeneratorClient; 5202f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba } 5302f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba 547b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch FileSystemClient* JavaSharedClient::GetFileSystemClient() 557b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch { 567b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch return gFileSystemClient; 577b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch } 587b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void JavaSharedClient::SetTimerClient(TimerClient* client) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gTimerClient = client; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void JavaSharedClient::SetCookieClient(CookieClient* client) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gCookieClient = client; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6964bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba void JavaSharedClient::SetPluginClient(PluginClient* client) 7064bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba { 7164bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba gPluginClient = client; 7264bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba } 7364bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba 7402f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba void JavaSharedClient::SetKeyGeneratorClient(KeyGeneratorClient* client) 7502f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba { 7602f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba gKeyGeneratorClient = client; 7702f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba } 7802f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba 797b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch void JavaSharedClient::SetFileSystemClient(FileSystemClient* client) 807b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch { 817b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch gFileSystemClient = client; 827b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch } 837b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimerClient* JavaSharedClient::gTimerClient = NULL; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CookieClient* JavaSharedClient::gCookieClient = NULL; 8664bd19be1df29b5d3b8207428607ca439fc04091Grace Kloba PluginClient* JavaSharedClient::gPluginClient = NULL; 8702f5cda5965b8aba67f5bdb5d308002920b9a05aGrace Kloba KeyGeneratorClient* JavaSharedClient::gKeyGeneratorClient = NULL; 887b52283c1a7f90ff5441d7bc30677c91af016b22Ben Murdoch FileSystemClient* JavaSharedClient::gFileSystemClient = NULL; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /////////////////////////////////////////////////////////////////////////// 9158cd2bf639bfde23e323e6a519976a120ab79059George Mount 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct FuncPtrRec { 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void (*fProc)(void* payload); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* fPayload; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 9658cd2bf639bfde23e323e6a519976a120ab79059George Mount 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static SkMutex gFuncPtrQMutex; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static SkDeque gFuncPtrQ(sizeof(FuncPtrRec)); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void JavaSharedClient::EnqueueFunctionPtr(void (*proc)(void* payload), 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* payload) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gFuncPtrQMutex.acquire(); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FuncPtrRec* rec = (FuncPtrRec*)gFuncPtrQ.push_back(); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rec->fProc = proc; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rec->fPayload = payload; 10858cd2bf639bfde23e323e6a519976a120ab79059George Mount 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gFuncPtrQMutex.release(); 11058cd2bf639bfde23e323e6a519976a120ab79059George Mount 1111da4c23e4d3bab3ac6655659ea441f46f28cf485Patrick Scott gTimerClient->signalServiceFuncPtrQueue(); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void JavaSharedClient::ServiceFunctionPtrQueue() 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11658cd2bf639bfde23e323e6a519976a120ab79059George Mount // Don't let execution block the WebViewCore thread for too long. 11758cd2bf639bfde23e323e6a519976a120ab79059George Mount void (*proc)(void*) = 0; 11858cd2bf639bfde23e323e6a519976a120ab79059George Mount void* payload = 0; 11958cd2bf639bfde23e323e6a519976a120ab79059George Mount const FuncPtrRec* rec; 12058cd2bf639bfde23e323e6a519976a120ab79059George Mount 12158cd2bf639bfde23e323e6a519976a120ab79059George Mount // we have to copy the proc/payload (if present). we do this so we 12258cd2bf639bfde23e323e6a519976a120ab79059George Mount // don't call the proc inside the mutex (possible deadlock!) 12358cd2bf639bfde23e323e6a519976a120ab79059George Mount gFuncPtrQMutex.acquire(); 12458cd2bf639bfde23e323e6a519976a120ab79059George Mount rec = (const FuncPtrRec*)gFuncPtrQ.front(); 12558cd2bf639bfde23e323e6a519976a120ab79059George Mount if (rec) { 12658cd2bf639bfde23e323e6a519976a120ab79059George Mount proc = rec->fProc; 12758cd2bf639bfde23e323e6a519976a120ab79059George Mount payload = rec->fPayload; 12858cd2bf639bfde23e323e6a519976a120ab79059George Mount gFuncPtrQ.pop_front(); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13058cd2bf639bfde23e323e6a519976a120ab79059George Mount bool scheduleAdditionalCall = (gFuncPtrQ.count() > 0); 13158cd2bf639bfde23e323e6a519976a120ab79059George Mount gFuncPtrQMutex.release(); 13258cd2bf639bfde23e323e6a519976a120ab79059George Mount 13358cd2bf639bfde23e323e6a519976a120ab79059George Mount if (rec) 13458cd2bf639bfde23e323e6a519976a120ab79059George Mount proc(payload); 13558cd2bf639bfde23e323e6a519976a120ab79059George Mount if (scheduleAdditionalCall) 13658cd2bf639bfde23e323e6a519976a120ab79059George Mount gTimerClient->signalServiceFuncPtrQueue(); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 139