15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
23c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "WTF.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/DefaultAllocator.h"
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/FastMalloc.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
373c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochnamespace WTF {
383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochextern void initializeThreading();
403c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
41bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool s_initialized;
42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool s_shutdown;
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool Partitions::s_initialized;
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PartitionAllocatorGeneric Partitions::m_bufferAllocator;
458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid initialize(TimeFunction currentTimeFunction, TimeFunction monotonicallyIncreasingTimeFunction)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
48bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // WTF, and Blink in general, cannot handle being re-initialized, even if shutdown first.
49bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // Make that explicit here.
50bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!s_initialized);
51bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!s_shutdown);
52bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    s_initialized = true;
538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Partitions::initialize();
543c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    setCurrentTimeFunction(currentTimeFunction);
553c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    setMonotonicallyIncreasingTimeFunction(monotonicallyIncreasingTimeFunction);
563c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    initializeThreading();
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid shutdown()
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
61bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(s_initialized);
62bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(!s_shutdown);
63bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    s_shutdown = true;
648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Partitions::shutdown();
658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool isShutdown()
68bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return s_shutdown;
70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void Partitions::initialize()
738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static int lock = 0;
751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // Guard against two threads hitting here in parallel.
761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    spinLockLock(&lock);
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!s_initialized) {
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_bufferAllocator.init();
79f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        s_initialized = true;
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    spinLockUnlock(&lock);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void Partitions::shutdown()
858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    fastMallocShutdown();
878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_bufferAllocator.shutdown();
888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
903c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch} // namespace WTF
91