diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/lazy/SkPurgeableMemoryBlock.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/lazy/SkPurgeableMemoryBlock.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,94 @@ +/* + * 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 SkPurgeableMemoryBlock_DEFINED +#define SkPurgeableMemoryBlock_DEFINED + +#include "SkTypes.h" + +class SkPurgeableMemoryBlock : public SkNoncopyable { + +public: + /** + * Whether or not this platform has an implementation for purgeable memory. + */ + static bool IsSupported(); + + /** + * Create a new purgeable memory block of 'size' bytes. Returns NULL if not supported on this + * platform or on failure. + * @param size Number of bytes requested. + * @return A new block, or NULL on failure. + */ + static SkPurgeableMemoryBlock* Create(size_t size); + +#ifdef SK_DEBUG + /** + * Whether the platform supports one shot purge of all unpinned blocks. If so, + * PurgeAllUnpinnedBlocks will be used to test a purge. Otherwise, purge will be called on + * individual blocks. + */ + static bool PlatformSupportsPurgingAllUnpinnedBlocks(); + + /** + * Purge all unpinned blocks at once, if the platform supports it. + */ + static bool PurgeAllUnpinnedBlocks(); + + // If PlatformSupportsPurgingAllUnpinnedBlocks returns true, this will not be called, so it can + // simply return false. + bool purge(); + + bool isPinned() const { return fPinned; } +#endif + + ~SkPurgeableMemoryBlock(); + + /** + * Output parameter for pin(), stating whether the data has been retained. + */ + enum PinResult { + /** + * The data has been purged, or this is the first call to pin. + */ + kUninitialized_PinResult, + + /** + * The data has been retained. The memory contains the same data it held when unpin() was + * called. + */ + kRetained_PinResult, + }; + + /** + * Pin the memory for use. Must not be called while already pinned. + * @param PinResult Whether the data was retained. Ignored on failure. + * @return Pointer to the pinned data on success. NULL on failure. + */ + void* pin(PinResult*); + + /** + * Unpin the data so it can be purged if necessary. + */ + void unpin(); + +private: + void* fAddr; + size_t fSize; + bool fPinned; +#ifdef SK_BUILD_FOR_ANDROID + int fFD; +#endif + + // Unimplemented default constructor is private, to prevent manual creation. + SkPurgeableMemoryBlock(); + + // The correct way to create a new one is from the static Create. + SkPurgeableMemoryBlock(size_t); +}; + +#endif // SkPurgeableMemoryBlock_DEFINED