18b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com/*
28b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com * Copyright 2013 Google Inc.
38b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com *
48b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com * Use of this source code is governed by a BSD-style license that can be
58b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com * found in the LICENSE file.
68b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com */
78b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
88b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com#ifndef SkDiscardableMemory_DEFINED
98b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com#define SkDiscardableMemory_DEFINED
108b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
112c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com#include "SkRefCnt.h"
128b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com#include "SkTypes.h"
138b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
148b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com/**
158b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com *  Interface for discardable memory. Implementation is provided by the
168b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com *  embedder.
178b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com */
18a6aa0e31f9e5e19fe6a2b2799fbdeea3ed373089commit-bot@chromium.orgclass SK_API SkDiscardableMemory {
198b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.compublic:
208b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    /**
218b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     *  Factory method that creates, initializes and locks an SkDiscardableMemory
228b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     *  object. If either of these steps fails, a NULL pointer will be returned.
238b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     */
248b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    static SkDiscardableMemory* Create(size_t bytes);
258b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
262c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com    /**
272c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com     *  Factory class that creates, initializes and locks an SkDiscardableMemory
282c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com     *  object. If either of these steps fails, a NULL pointer will be returned.
292c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com     */
302c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com    class Factory : public SkRefCnt {
312c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com    public:
322c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com        virtual SkDiscardableMemory* create(size_t bytes) = 0;
332c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com    private:
342c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com        typedef SkRefCnt INHERITED;
352c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com    };
362c7c7ee47d75e7815ea8db05e924ab55958cb402halcanary@google.com
378b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    /** Must not be called while locked.
388b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     */
398b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    virtual ~SkDiscardableMemory() {}
408b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
418b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    /**
428b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * Locks the memory, prevent it from being discarded. Once locked. you may
438b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * obtain a pointer to that memory using the data() method.
448b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     *
458b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * lock() may return false, indicating that the underlying memory was
468b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * discarded and that the lock failed.
478b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     *
488b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * Nested calls to lock are not allowed.
498b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     */
508b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    virtual bool lock() = 0;
518b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
528b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    /**
538b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * Returns the current pointer for the discardable memory. This call is ONLY
548b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * valid when the discardable memory object is locked.
558b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     */
568b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    virtual void* data() = 0;
578b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
588b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    /**
598b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * Unlock the memory so that it can be purged by the system. Must be called
608b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     * after every successful lock call.
618b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com     */
628b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com    virtual void unlock() = 0;
638b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com};
648b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com
658b71ef16ece9ec7f1250f2dc093d9a2282f4c2ccscroggo@google.com#endif
66