CodeCache.cpp revision 949aa238981e6cedfc6d3f12fc9001a71162c6f3
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/codeflinger/CodeCache.cpp 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#include <assert.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 22beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich#include <unistd.h> 23beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich#include <sys/mman.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#include <cutils/ashmem.h> 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/atomic.h> 2704b5ac36a50a5fdaf3510c3c4c4e89bc35cfe26eIan Rogers#define LOG_TAG "CodeCache" 2804b5ac36a50a5fdaf3510c3c4c4e89bc35cfe26eIan Rogers#include <cutils/log.h> 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 319857d99eecc389389da261a72461322d5cfb8eebMathias Agopian#include "CodeCache.h" 322d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android { 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37658f89dc5c418dbbc0c5d78f5861855b90ca8c9fAshok Bhat#if defined(__arm__) || defined(__aarch64__) 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if defined(__mips__) 432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <asm/cachectl.h> 442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include <errno.h> 452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif 462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind 472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind// ---------------------------------------------------------------------------- 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 502d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers// A dlmalloc mspace is used to manage the code cache over a mmaped region. 512d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define HAVE_MMAP 0 522d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define HAVE_MREMAP 0 532d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define HAVE_MORECORE 0 542d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define MALLOC_ALIGNMENT 16 552d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define MSPACES 1 562d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define NO_MALLINFO 1 572d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define ONLY_MSPACES 1 582d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers// Custom heap error handling. 592d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define PROCEED_ON_ERROR 0 602d13791ce7ff61221ca047553891f31a23b2e943Ian Rogersstatic void heap_error(const char* msg, const char* function, void* p); 612d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define CORRUPTION_ERROR_ACTION(m) \ 622d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers heap_error("HEAP MEMORY CORRUPTION", __FUNCTION__, NULL) 632d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#define USAGE_ERROR_ACTION(m,p) \ 642d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers heap_error("ARGUMENT IS INVALID HEAP ADDRESS", __FUNCTION__, p) 652d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 662d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers#include "../../../../bionic/libc/upstream-dlmalloc/malloc.c" 672d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 682d13791ce7ff61221ca047553891f31a23b2e943Ian Rogersstatic void heap_error(const char* msg, const char* function, void* p) { 692d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers ALOG(LOG_FATAL, LOG_TAG, "@@@ ABORTING: CODE FLINGER: %s IN %s addr=%p", 702d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers msg, function, p); 712d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers /* So that we can get a memory dump around p */ 722d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers *((int **) 0xdeadbaad) = (int *) p; 732d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers} 742d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 752d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers// ---------------------------------------------------------------------------- 762d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 772d13791ce7ff61221ca047553891f31a23b2e943Ian Rogersstatic void* gExecutableStore = NULL; 782d13791ce7ff61221ca047553891f31a23b2e943Ian Rogersstatic mspace gMspace = NULL; 792d13791ce7ff61221ca047553891f31a23b2e943Ian Rogersconst size_t kMaxCodeCacheCapacity = 1024 * 1024; 802d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 812d13791ce7ff61221ca047553891f31a23b2e943Ian Rogersstatic mspace getMspace() 822d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers{ 832d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers if (gExecutableStore == NULL) { 842d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers int fd = ashmem_create_region("CodeFlinger code cache", 852d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers kMaxCodeCacheCapacity); 862d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers LOG_ALWAYS_FATAL_IF(fd < 0, 872d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "Creating code cache, ashmem_create_region " 882d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "failed with error '%s'", strerror(errno)); 892d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers gExecutableStore = mmap(NULL, kMaxCodeCacheCapacity, 902d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers PROT_READ | PROT_WRITE | PROT_EXEC, 912d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers MAP_PRIVATE, fd, 0); 92473a729937476d5e18b5e10b7b2eff119202fd46Hurri Lu LOG_ALWAYS_FATAL_IF(gExecutableStore == MAP_FAILED, 932d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "Creating code cache, mmap failed with error " 942d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "'%s'", strerror(errno)); 952d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers close(fd); 962d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers gMspace = create_mspace_with_base(gExecutableStore, kMaxCodeCacheCapacity, 972d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers /*locked=*/ false); 982d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers mspace_set_footprint_limit(gMspace, kMaxCodeCacheCapacity); 992d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers } 1002d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers return gMspace; 1012d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers} 1022d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectAssembly::Assembly(size_t size) 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project : mCount(1), mSize(0) 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 106beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich mBase = (uint32_t*)mspace_malloc(getMspace(), size); 1072d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers LOG_ALWAYS_FATAL_IF(mBase == NULL, 1082d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "Failed to create Assembly of size %zd in executable " 1092d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "store of size %zd", size, kMaxCodeCacheCapacity); 110beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich mSize = size; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectAssembly::~Assembly() 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 115beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich mspace_free(getMspace(), mBase); 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid Assembly::incStrong(const void*) const 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_atomic_inc(&mCount); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid Assembly::decStrong(const void*) const 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (android_atomic_dec(&mCount) == 1) { 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delete this; 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectssize_t Assembly::size() const 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!mBase) return NO_MEMORY; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return mSize; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectuint32_t* Assembly::base() const 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return mBase; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectssize_t Assembly::resize(size_t newSize) 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 143beeeee705bcf16d705748713ea40dca3486cc7b7Nick Kralevich mBase = (uint32_t*)mspace_realloc(getMspace(), mBase, newSize); 1442d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers LOG_ALWAYS_FATAL_IF(mBase == NULL, 1452d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "Failed to resize Assembly to %zd in code cache " 1462d13791ce7ff61221ca047553891f31a23b2e943Ian Rogers "of size %zd", newSize, kMaxCodeCacheCapacity); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mSize = newSize; 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return size(); 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectCodeCache::CodeCache(size_t size) 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project : mCacheSize(size), mCacheInUse(0) 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_init(&mLock, 0); 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectCodeCache::~CodeCache() 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_destroy(&mLock); 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsp<Assembly> CodeCache::lookup(const AssemblyKeyBase& keyBase) const 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_lock(&mLock); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sp<Assembly> r; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ssize_t index = mCacheData.indexOfKey(key_t(keyBase)); 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (index >= 0) { 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const cache_entry_t& e = mCacheData.valueAt(index); 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project e.when = mWhen++; 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = e.entry; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&mLock); 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint CodeCache::cache( const AssemblyKeyBase& keyBase, 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const sp<Assembly>& assembly) 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_lock(&mLock); 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const ssize_t assemblySize = assembly->size(); 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (mCacheInUse + assemblySize > mCacheSize) { 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // evict the LRU 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t lru = 0; 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t count = mCacheData.size(); 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const cache_entry_t& e = mCacheData.valueAt(i); 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (e.when < mCacheData.valueAt(lru).when) { 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lru = i; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const cache_entry_t& e = mCacheData.valueAt(lru); 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mCacheInUse -= e.entry->size(); 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mCacheData.removeItemsAt(lru); 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ssize_t err = mCacheData.add(key_t(keyBase), cache_entry_t(assembly, mWhen)); 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err >= 0) { 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mCacheInUse += assemblySize; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mWhen++; 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // synchronize caches... 204949aa238981e6cedfc6d3f12fc9001a71162c6f3Dan Albert char* base = reinterpret_cast<char*>(assembly->base()); 205949aa238981e6cedfc6d3f12fc9001a71162c6f3Dan Albert char* curr = reinterpret_cast<char*>(base + assembly->size()); 206410ae2fe8e5d78cbce7b20be87828c5595e76842Ashok Bhat __builtin___clear_cache(base, curr); 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&mLock); 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return err; 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android 216