1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/codeflinger/CodeCache.h 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Copyright 2006, The Android Open Source Project 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** you may not use this file except in compliance with the License. 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** You may obtain a copy of the License at 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** See the License for the specific language governing permissions and 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** limitations under the License. 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef ANDROID_CODECACHE_H 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_CODECACHE_H 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pthread.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26006ba85e981d66ecf262a0ba0b2a6160b1923f24Mathias Agopian#include "tinyutils/KeyedVector.h" 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "tinyutils/smartpointer.h" 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android { 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass AssemblyKeyBase { 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic: 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project virtual ~AssemblyKeyBase() { } 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project virtual int compare_type(const AssemblyKeyBase& key) const = 0; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass AssemblyKey : public AssemblyKeyBase 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic: 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project AssemblyKey(const T& rhs) : mKey(rhs) { } 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project virtual int compare_type(const AssemblyKeyBase& key) const { 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const T& rhs = static_cast<const AssemblyKey&>(key).mKey; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return android::compare_type(mKey, rhs); 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprivate: 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project T mKey; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass Assembly 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic: 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Assembly(size_t size); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project virtual ~Assembly(); 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ssize_t size() const; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t* base() const; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ssize_t resize(size_t size); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // protocol for sp<> 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void incStrong(const void* id) const; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void decStrong(const void* id) const; 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project typedef void weakref_type; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprivate: 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutable int32_t mCount; 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t* mBase; 72beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich size_t mSize; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass CodeCache 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic: 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// pretty simple cache API... 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CodeCache(size_t size); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ~CodeCache(); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sp<Assembly> lookup(const AssemblyKeyBase& key) const; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int cache( const AssemblyKeyBase& key, 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const sp<Assembly>& assembly); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprivate: 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // nothing to see here... 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct cache_entry_t { 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project inline cache_entry_t() { } 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project inline cache_entry_t(const sp<Assembly>& a, int64_t w) 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project : entry(a), when(w) { } 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sp<Assembly> entry; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutable int64_t when; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project class key_t { 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project friend int compare_type( 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const key_value_pair_t<key_t, cache_entry_t>&, 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const key_value_pair_t<key_t, cache_entry_t>&); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const AssemblyKeyBase* mKey; 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project public: 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_t() { }; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_t(const AssemblyKeyBase& k) : mKey(&k) { } 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutable pthread_mutex_t mLock; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutable int64_t mWhen; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t mCacheSize; 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t mCacheInUse; 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project KeyedVector<key_t, cache_entry_t> mCacheData; 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project friend int compare_type( 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const key_value_pair_t<key_t, cache_entry_t>&, 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const key_value_pair_t<key_t, cache_entry_t>&); 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// KeyedVector uses compare_type(), which is more efficient, than 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// just using operator < () 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectinline int compare_type( 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const key_value_pair_t<CodeCache::key_t, CodeCache::cache_entry_t>& lhs, 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const key_value_pair_t<CodeCache::key_t, CodeCache::cache_entry_t>& rhs) 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return lhs.key.mKey->compare_type(*(rhs.key.mKey)); 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif //ANDROID_CODECACHE_H 134