/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkDiscardableMemoryPool_DEFINED
#define SkDiscardableMemoryPool_DEFINED

#include "SkDiscardableMemory.h"
#include "SkTInternalLList.h"
#include "SkThread.h"

#ifdef SK_DEBUG
    #define LAZY_CACHE_STATS 1
#elif !defined(LAZY_CACHE_STATS)
    #define LAZY_CACHE_STATS 0
#endif

/**
 *  This non-global pool can be used for unit tests to verify that the
 *  pool works.
 */
class SkPoolDiscardableMemory;
class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
public:
    /**
     *  Without mutex, will be not be thread safe.
     */
    SkDiscardableMemoryPool(size_t budget, SkBaseMutex* mutex = NULL);
    ~SkDiscardableMemoryPool();
    SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE;
    size_t getRAMUsed();
    void setRAMBudget(size_t budget);
    /** purges all unlocked DMs */
    void dumpPool();
    friend class SkPoolDiscardableMemory;
    #if LAZY_CACHE_STATS
    int          fCacheHits;
    int          fCacheMisses;
    #endif  // LAZY_CACHE_STATS

private:
    SkBaseMutex* fMutex;
    size_t       fBudget;
    size_t       fUsed;
    SkTInternalLList<SkPoolDiscardableMemory> fList;
    /** Function called to free memory if needed */
    void dumpDownTo(size_t budget);
    /** called by SkDiscardableMemoryPool upon destruction */
    void free(SkPoolDiscardableMemory* dm);
    /** called by SkDiscardableMemoryPool::lock() */
    bool lock(SkPoolDiscardableMemory* dm);
    /** called by SkDiscardableMemoryPool::unlock() */
    void unlock(SkPoolDiscardableMemory* dm);
    typedef SkDiscardableMemory::Factory INHERITED;
};

/**
 *  Returns (and creates if needed) a threadsafe global
 *  SkDiscardableMemoryPool.
 */
SkDiscardableMemoryPool* SkGetGlobalDiscardableMemoryPool();

#if !defined(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE)
#define SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE (128 * 1024 * 1024)
#endif

#endif  // SkDiscardableMemoryPool_DEFINED
