From 9908d834bed5996b1634f15e92a84b51a99c54df Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 3 Feb 2010 18:55:52 +0000 Subject: [PATCH] Forgot to add this one in the previous commit: The PageCacheLocker does have its own source file now that the page daemon source file is gone. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35394 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/PageCacheLocker.cpp | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/system/kernel/vm/PageCacheLocker.cpp 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; +}