]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2006 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ | |
5 | * | |
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. The rights granted to you under the License | |
10 | * may not be used to create, or enable the creation or redistribution of, | |
11 | * unlawful or unlicensed copies of an Apple operating system, or to | |
12 | * circumvent, violate, or enable the circumvention or violation of, any | |
13 | * terms of an Apple operating system software license agreement. | |
14 | * | |
15 | * Please obtain a copy of the License at | |
16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. | |
17 | * | |
18 | * The Original Code and all software distributed under the License are | |
19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
23 | * Please see the License for the specific language governing rights and | |
24 | * limitations under the License. | |
25 | * | |
26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ | |
27 | */ | |
28 | /*! | |
29 | @header kern_memorystatus.h | |
30 | This header defines a kernel event subclass for the OSMemoryNotification API | |
31 | */ | |
32 | ||
33 | #ifndef SYS_KERN_MEMORYSTATUS_H | |
34 | #define SYS_KERN_MEMORYSTATUS_H | |
35 | ||
36 | #ifndef MACH_KERNEL_PRIVATE | |
37 | ||
38 | #include <stdint.h> | |
39 | #include <sys/time.h> | |
40 | #include <sys/proc.h> | |
41 | ||
42 | /* | |
43 | * Define Memory Status event subclass. | |
44 | * Subclass of KEV_SYSTEM_CLASS | |
45 | */ | |
46 | ||
47 | /*! | |
48 | @defined KEV_MEMORYSTATUS_SUBCLASS | |
49 | @discussion The kernel event subclass for memory status events. | |
50 | */ | |
51 | #define KEV_MEMORYSTATUS_SUBCLASS 3 | |
52 | ||
53 | enum { | |
54 | kMemoryStatusLevelNote = 1, | |
55 | kMemoryStatusSnapshotNote = 2, | |
56 | kMemoryStatusHibernationNote = 3 | |
57 | }; | |
58 | ||
59 | enum { | |
60 | kMemoryStatusLevelAny = -1, | |
61 | kMemoryStatusLevelNormal = 0, | |
62 | kMemoryStatusLevelWarning = 1, | |
63 | kMemoryStatusLevelUrgent = 2, | |
64 | kMemoryStatusLevelCritical = 3 | |
65 | }; | |
66 | ||
67 | typedef struct jetsam_priority_entry { | |
68 | pid_t pid; | |
69 | uint32_t flags; | |
70 | int32_t hiwat_pages; | |
71 | int32_t hiwat_reserved1; | |
72 | int32_t hiwat_reserved2; | |
73 | int32_t hiwat_reserved3; | |
74 | } jetsam_priority_entry_t; | |
75 | ||
76 | /* | |
77 | ** maximum killable processes to keep track of | |
78 | */ | |
79 | #define kMaxPriorityEntries 64 | |
80 | ||
81 | typedef struct jetsam_snapshot_entry { | |
82 | pid_t pid; | |
83 | char name[MAXCOMLEN+1]; | |
84 | uint32_t pages; | |
85 | uint32_t flags; | |
86 | uint8_t uuid[16]; | |
87 | } jetsam_snapshot_entry_t; | |
88 | ||
89 | /* | |
90 | ** how many processes to snapshot | |
91 | */ | |
92 | #define kMaxSnapshotEntries 128 | |
93 | ||
94 | typedef struct jetsam_kernel_stats { | |
95 | uint32_t free_pages; | |
96 | uint32_t active_pages; | |
97 | uint32_t inactive_pages; | |
98 | uint32_t purgeable_pages; | |
99 | uint32_t wired_pages; | |
100 | } jetsam_kernel_stats_t; | |
101 | ||
102 | /* | |
103 | ** This is a variable-length struct. | |
104 | ** Allocate a buffer of the size returned by the sysctl, cast to a jetsam_snapshot_t * | |
105 | */ | |
106 | ||
107 | typedef struct jetsam_snapshot { | |
108 | jetsam_kernel_stats_t stats; | |
109 | size_t entry_count; | |
110 | jetsam_snapshot_entry_t entries[1]; | |
111 | } jetsam_snapshot_t; | |
112 | ||
113 | typedef struct jetsam_hibernation_entry { | |
114 | uint32_t pid; | |
115 | uint32_t flags; | |
116 | uint32_t pages; | |
117 | } jetsam_hibernation_entry_t; | |
118 | ||
119 | #endif /* !MACH_KERNEL_PRIVATE */ | |
120 | ||
121 | enum { | |
122 | kJetsamFlagsFrontmost = (1 << 0), | |
123 | kJetsamFlagsKilled = (1 << 1), | |
124 | kJetsamFlagsKilledHiwat = (1 << 2), | |
125 | kJetsamFlagsHibernated = (1 << 3), | |
126 | kJetsamFlagsKilledVnodes = (1 << 4), | |
127 | kJetsamFlagsKilledSwap = (1 << 5), | |
128 | kJetsamFlagsThawed = (1 << 6), | |
129 | kJetsamFlagsKilledVM = (1 << 7), | |
130 | kJetsamFlagsSuspForDiagnosis = (1 << 8) | |
131 | }; | |
132 | ||
133 | #ifdef KERNEL | |
134 | extern void kern_memorystatus_init(void) __attribute__((section("__TEXT, initcode"))); | |
135 | extern int jetsam_kill_top_proc(boolean_t any, uint32_t reason); | |
136 | ||
137 | extern int kern_memorystatus_wakeup; | |
138 | extern int kern_memorystatus_level; | |
139 | extern unsigned int kern_memorystatus_delta; | |
140 | ||
141 | #ifdef CONFIG_FREEZE | |
142 | extern void kern_hibernation_init(void) __attribute__((section("__TEXT, initcode"))); | |
143 | extern int kern_hibernation_wakeup; | |
144 | ||
145 | void kern_hibernation_on_pid_suspend(int pid); | |
146 | void kern_hibernation_on_pid_resume(int pid, task_t task); | |
147 | void kern_hibernation_on_pid_hibernate(int pid); | |
148 | #endif | |
149 | ||
150 | #if CONFIG_EMBEDDED | |
151 | #define VM_CHECK_MEMORYSTATUS do { vm_check_memorystatus(); } while(0) | |
152 | #else /*CONFIG_EMBEDDED*/ | |
153 | #define VM_CHECK_MEMORYSTATUS do {} while(0) | |
154 | #endif | |
155 | ||
156 | #endif /* KERNEL */ | |
157 | #endif /* SYS_KERN_MEMORYSTATUS_H */ |