2 * Copyright (c) 2007 Apple Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 * Purgeable spelling rules
26 * It is believed that the correct spelling is
27 * { 'p', 'u', 'r', 'g', 'e', 'a', 'b', 'l', 'e' }.
28 * However, there is one published API that likes to spell it without the
29 * first 'e', vm_purgable_control(). Since we can't change that API,
31 * All qualifiers defined in vm_purgable.h are spelled without the e.
32 * All other qualifiers are spelled with the e.
33 * Right now, there are remains of the wrong spelling throughout the code,
34 * vm_object_t.purgable for example. We expect to change these on occasion.
37 #ifndef __VM_PURGEABLE_INTERNAL__
38 #define __VM_PURGEABLE_INTERNAL__
40 #include <kern/queue.h>
42 enum purgeable_q_type
{
43 PURGEABLE_Q_TYPE_OBSOLETE
,
44 PURGEABLE_Q_TYPE_FIFO
,
45 PURGEABLE_Q_TYPE_LIFO
,
49 typedef uint32_t token_idx_t
;
50 typedef uint32_t token_cnt_t
;
51 #define TOKEN_COUNT_MAX UINT32_MAX
53 #define NUM_VOLATILE_GROUPS 8
55 token_idx_t token_q_head
; /* first token */
56 token_idx_t token_q_tail
; /* last token */
57 token_idx_t token_q_unripe
; /* first token which is not ripe */
59 queue_head_t objq
[NUM_VOLATILE_GROUPS
];
60 enum purgeable_q_type type
;
62 int debug_count_tokens
;
63 int debug_count_objects
;
67 typedef struct purgeable_q
* purgeable_q_t
;
69 extern struct purgeable_q purgeable_queues
[PURGEABLE_Q_TYPE_MAX
];
70 extern int32_t token_new_pagecount
;
71 #define TOKEN_NEW_PAGECOUNT_MAX INT32_MAX
72 extern int available_for_purge
;
77 * the token counters are protected by the vm_page_queue_lock, since they're
78 * mostly used in that context and we don't want to do a lot of extra locking
79 * the purgeable page queues are protected by a separate lock since they're
80 * mostly used on a user context and we don't want any contention with the
83 decl_lck_mtx_data(extern,vm_purgeable_queue_lock
)
85 /* add a new token to queue. called by vm_object_purgeable_control */
86 /* enter with page queue locked */
87 kern_return_t
vm_purgeable_token_add(purgeable_q_t queue
);
89 /* enter with page queue locked */
90 void vm_purgeable_token_delete_first(purgeable_q_t queue
);
91 void vm_purgeable_token_delete_last(purgeable_q_t queue
);
94 * decrement token counters.
95 * enter with page queue locked
97 void vm_purgeable_q_advance_all(void);
99 /* the object purger. purges the next eligible object from memory. */
100 /* returns TRUE if an object was purged, otherwise FALSE. */
101 boolean_t
vm_purgeable_object_purge_one(int force_purge_below_group
);
103 /* purge all volatile objects now */
104 void vm_purgeable_object_purge_all(void);
106 /* insert purgeable object into queue */
107 void vm_purgeable_object_add(vm_object_t object
, purgeable_q_t queue
, int group
);
109 /* look for object. If found, remove from purgeable queue. */
110 purgeable_q_t
vm_purgeable_object_remove(vm_object_t object
);
112 /* statistics for purgable objects in all queues */
113 void vm_purgeable_stats(vm_purgeable_info_t info
, task_t target_task
);
115 void vm_purgeable_disown(task_t task
);
117 #endif /* __VM_PURGEABLE_INTERNAL__ */