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