diff --git a/src/system/kernel/vm/PageCacheLocker.cpp b/src/system/kernel/vm/PageCacheLocker.cpp new file mode 100644 index 0000000000..0fbd226841 --- /dev/null +++ b/src/system/kernel/vm/PageCacheLocker.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ + + +#include "PageCacheLocker.h" + +#include + + +bool +PageCacheLocker::_IgnorePage(vm_page* page) +{ + if (page->busy || page->state == PAGE_STATE_WIRED + || page->state == PAGE_STATE_FREE || page->state == PAGE_STATE_CLEAR + || page->state == PAGE_STATE_UNUSED || page->wired_count > 0) + return true; + + return false; +} + + +bool +PageCacheLocker::Lock(vm_page* page, bool dontWait) +{ + if (_IgnorePage(page)) + return false; + + // Grab a reference to this cache. + VMCache* cache = vm_cache_acquire_locked_page_cache(page, dontWait); + if (cache == NULL) + return false; + + if (_IgnorePage(page)) { + cache->ReleaseRefAndUnlock(); + return false; + } + + fPage = page; + return true; +} + + +void +PageCacheLocker::Unlock() +{ + if (fPage == NULL) + return; + + fPage->Cache()->ReleaseRefAndUnlock(); + + fPage = NULL; +}