1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkDiscardableMemory_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkDiscardableMemory_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker /** 15*c8dee2aaSAndroid Build Coastguard Worker * Interface for discardable memory. Implementation is provided by the 16*c8dee2aaSAndroid Build Coastguard Worker * embedder. 17*c8dee2aaSAndroid Build Coastguard Worker */ 18*c8dee2aaSAndroid Build Coastguard Worker class SK_SPI SkDiscardableMemory { 19*c8dee2aaSAndroid Build Coastguard Worker public: 20*c8dee2aaSAndroid Build Coastguard Worker /** 21*c8dee2aaSAndroid Build Coastguard Worker * Factory method that creates, initializes and locks an SkDiscardableMemory 22*c8dee2aaSAndroid Build Coastguard Worker * object. If either of these steps fails, a nullptr pointer will be returned. 23*c8dee2aaSAndroid Build Coastguard Worker */ 24*c8dee2aaSAndroid Build Coastguard Worker static SkDiscardableMemory* Create(size_t bytes); 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker /** 27*c8dee2aaSAndroid Build Coastguard Worker * Factory class that creates, initializes and locks an SkDiscardableMemory 28*c8dee2aaSAndroid Build Coastguard Worker * object. If either of these steps fails, a nullptr pointer will be returned. 29*c8dee2aaSAndroid Build Coastguard Worker */ 30*c8dee2aaSAndroid Build Coastguard Worker class Factory : public SkRefCnt { 31*c8dee2aaSAndroid Build Coastguard Worker public: 32*c8dee2aaSAndroid Build Coastguard Worker virtual SkDiscardableMemory* create(size_t bytes) = 0; 33*c8dee2aaSAndroid Build Coastguard Worker private: 34*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkRefCnt; 35*c8dee2aaSAndroid Build Coastguard Worker }; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker /** Must not be called while locked. 38*c8dee2aaSAndroid Build Coastguard Worker */ ~SkDiscardableMemory()39*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkDiscardableMemory() {} 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker /** 42*c8dee2aaSAndroid Build Coastguard Worker * Locks the memory, prevent it from being discarded. Once locked. you may 43*c8dee2aaSAndroid Build Coastguard Worker * obtain a pointer to that memory using the data() method. 44*c8dee2aaSAndroid Build Coastguard Worker * 45*c8dee2aaSAndroid Build Coastguard Worker * lock() may return false, indicating that the underlying memory was 46*c8dee2aaSAndroid Build Coastguard Worker * discarded and that the lock failed. 47*c8dee2aaSAndroid Build Coastguard Worker * 48*c8dee2aaSAndroid Build Coastguard Worker * Nested calls to lock are not allowed. 49*c8dee2aaSAndroid Build Coastguard Worker */ 50*c8dee2aaSAndroid Build Coastguard Worker [[nodiscard]] virtual bool lock() = 0; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker /** 53*c8dee2aaSAndroid Build Coastguard Worker * Returns the current pointer for the discardable memory. This call is ONLY 54*c8dee2aaSAndroid Build Coastguard Worker * valid when the discardable memory object is locked. 55*c8dee2aaSAndroid Build Coastguard Worker */ 56*c8dee2aaSAndroid Build Coastguard Worker virtual void* data() = 0; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker /** 59*c8dee2aaSAndroid Build Coastguard Worker * Unlock the memory so that it can be purged by the system. Must be called 60*c8dee2aaSAndroid Build Coastguard Worker * after every successful lock call. 61*c8dee2aaSAndroid Build Coastguard Worker */ 62*c8dee2aaSAndroid Build Coastguard Worker virtual void unlock() = 0; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker protected: 65*c8dee2aaSAndroid Build Coastguard Worker SkDiscardableMemory() = default; 66*c8dee2aaSAndroid Build Coastguard Worker SkDiscardableMemory(const SkDiscardableMemory&) = delete; 67*c8dee2aaSAndroid Build Coastguard Worker SkDiscardableMemory& operator=(const SkDiscardableMemory&) = delete; 68*c8dee2aaSAndroid Build Coastguard Worker }; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker #endif 71