1/* 2 * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "PageCacheLocker.h" 8 9#include <vm/VMCache.h> 10 11 12bool 13PageCacheLocker::_IgnorePage(vm_page* page) 14{ 15 if (page->busy || page->State() == PAGE_STATE_WIRED 16 || page->State() == PAGE_STATE_FREE || page->State() == PAGE_STATE_CLEAR 17 || page->State() == PAGE_STATE_UNUSED || page->WiredCount() > 0) 18 return true; 19 20 return false; 21} 22 23 24bool 25PageCacheLocker::Lock(vm_page* page, bool dontWait) 26{ 27 if (_IgnorePage(page)) 28 return false; 29 30 // Grab a reference to this cache. 31 VMCache* cache = vm_cache_acquire_locked_page_cache(page, dontWait); 32 if (cache == NULL) 33 return false; 34 35 if (_IgnorePage(page)) { 36 cache->ReleaseRefAndUnlock(); 37 return false; 38 } 39 40 fPage = page; 41 return true; 42} 43 44 45void 46PageCacheLocker::Unlock() 47{ 48 if (fPage == NULL) 49 return; 50 51 fPage->Cache()->ReleaseRefAndUnlock(); 52 53 fPage = NULL; 54} 55