18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
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 *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "config.h"
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueue.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include "WorkQueueItem.h"
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#include <wtf/Assertions.h>
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic const unsigned queueLength = 1024;
36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WorkQueueItem* theQueue[queueLength];
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic unsigned startOfQueue;
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic unsigned endOfQueue;
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWorkQueue* WorkQueue::shared()
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    static WorkQueue* sharedInstance = new WorkQueue;
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return sharedInstance;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWorkQueue::WorkQueue()
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    : m_frozen(false)
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WorkQueue::queue(WorkQueueItem* item)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(endOfQueue < queueLength);
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(endOfQueue >= startOfQueue);
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_frozen) {
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        delete item;
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    theQueue[endOfQueue++] = item;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkWorkQueueItem* WorkQueue::dequeue()
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(endOfQueue >= startOfQueue);
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (startOfQueue == endOfQueue)
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return 0;
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return theQueue[startOfQueue++];
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkunsigned WorkQueue::count()
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return endOfQueue - startOfQueue;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WorkQueue::clear()
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (unsigned i = startOfQueue; i < endOfQueue; ++i) {
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        delete theQueue[i];
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        theQueue[i] = 0;
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    startOfQueue = 0;
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    endOfQueue = 0;
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool WorkQueue::processWork()
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool startedLoad = false;
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    while (!startedLoad && count()) {
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WorkQueueItem* item = dequeue();
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(item);
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        startedLoad = item->invoke();
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        delete item;
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // If we're done and we didn't start a load, then we're really done, so return true.
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return !startedLoad;
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
105