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