2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <sys/types.h>
25 #include "include/ss_data.h"
29 #define LIMITED_PROCESS_OOMADJ 15
31 int get_app_oomadj(int pid, int *oomadj)
39 snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", pid);
43 if (fgets(buf, PATH_MAX, fp) == NULL) {
47 (*oomadj) = atoi(buf);
52 int set_app_oomadj(pid_t pid, int new_oomadj)
57 char exe_name[PATH_MAX];
59 if (sysman_get_cmdline_name(pid, exe_name, PATH_MAX) < 0)
60 snprintf(exe_name, sizeof(exe_name), "Unknown (maybe dead)");
62 snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", pid);
66 if (fgets(buf, PATH_MAX, fp) == NULL) {
70 old_oomadj = atoi(buf);
72 PRT_TRACE_EM("Process %s, pid %d, old_oomadj %d", exe_name, pid,
75 if (old_oomadj < OOMADJ_APP_LIMIT)
78 PRT_TRACE_EM("Process %s, pid %d, new_oomadj %d", exe_name, pid,
80 snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", pid);
85 fprintf(fp, "%d", new_oomadj);
91 int set_oomadj_action(int argc, char **argv)
98 if ((pid = atoi(argv[0])) < 0 || (new_oomadj = atoi(argv[1])) <= -20)
104 PRT_TRACE_EM("OOMADJ_SET : pid %d, new_oomadj %d", pid, new_oomadj);
105 snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", pid);
106 fp = fopen(buf, "w");
109 fprintf(fp, "%d", new_oomadj);
115 int check_and_set_old_backgrd()
119 struct dirent *dentry;
124 dp = opendir("/proc");
126 PRT_TRACE_EM("BACKGRD MANAGE : fail to open /proc : %s", strerror(errno));
130 while ((dentry = readdir(dp)) != NULL) {
131 if (!isdigit(dentry->d_name[0]))
134 pid = atoi(dentry->d_name);
136 snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", pid);
137 fp = fopen(buf, "r");
140 if (fgets(buf, sizeof(buf), fp) == NULL) {
144 if(atoi(buf) == OOMADJ_BACKGRD_UNLOCKED) {
146 PRT_TRACE("BACKGRD MANAGE : process wchich has OOMADJ_BACKGRD_UNLOCKED exists");
153 if(dentry != NULL ) {
155 dp = opendir("/proc");
157 PRT_TRACE_EM("BACKGRD MANAGE : fail to open /proc : %s", strerror(errno));
160 while ((dentry = readdir(dp)) != NULL) {
162 if (!isdigit(dentry->d_name[0]))
165 pid = atoi(dentry->d_name);
167 snprintf(buf, sizeof(buf), "/proc/%d/oom_adj", pid);
168 fp = fopen(buf, "r+");
171 if (fgets(buf, sizeof(buf), fp) == NULL) {
176 if(cur_oom >= LIMITED_PROCESS_OOMADJ) {
177 PRT_TRACE("BACKGRD MANAGE : kill the process %d (oom_adj %d)", pid, cur_oom);
180 else if(cur_oom >= OOMADJ_BACKGRD_UNLOCKED) {
181 PRT_TRACE("BACKGRD MANAGE : process %d set oom_adj %d (before %d)", pid, cur_oom+1, cur_oom);
182 fprintf(fp, "%d", ++cur_oom);
191 int set_active_action(int argc, char **argv)
199 if ((pid = atoi(argv[0])) < 0)
202 if (get_app_oomadj(pid, &oomadj) < 0)
206 case OOMADJ_FOREGRD_LOCKED:
207 case OOMADJ_BACKGRD_LOCKED:
211 case OOMADJ_FOREGRD_UNLOCKED:
212 ret = set_app_oomadj((pid_t) pid, OOMADJ_FOREGRD_LOCKED);
214 case OOMADJ_BACKGRD_UNLOCKED:
215 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_LOCKED);
218 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_LOCKED);
221 if(oomadj > OOMADJ_BACKGRD_UNLOCKED) {
222 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_LOCKED);
224 PRT_TRACE_EM("Unknown oomadj value (%d) !", oomadj);
232 int set_inactive_action(int argc, char **argv)
240 if ((pid = atoi(argv[0])) < 0)
243 if (get_app_oomadj(pid, &oomadj) < 0)
247 case OOMADJ_FOREGRD_UNLOCKED:
248 case OOMADJ_BACKGRD_UNLOCKED:
252 case OOMADJ_FOREGRD_LOCKED:
253 ret = set_app_oomadj((pid_t) pid, OOMADJ_FOREGRD_UNLOCKED);
255 case OOMADJ_BACKGRD_LOCKED:
256 check_and_set_old_backgrd();
257 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_UNLOCKED);
260 check_and_set_old_backgrd();
261 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_UNLOCKED);
264 if(oomadj > OOMADJ_BACKGRD_UNLOCKED) {
267 PRT_TRACE_EM("Unknown oomadj value (%d) !", oomadj);
276 int set_foregrd_action(int argc, char **argv)
284 if ((pid = atoi(argv[0])) < 0)
287 if (get_app_oomadj(pid, &oomadj) < 0)
291 case OOMADJ_FOREGRD_LOCKED:
292 case OOMADJ_FOREGRD_UNLOCKED:
296 case OOMADJ_BACKGRD_LOCKED:
297 ret = set_app_oomadj((pid_t) pid, OOMADJ_FOREGRD_LOCKED);
299 case OOMADJ_BACKGRD_UNLOCKED:
300 ret = set_app_oomadj((pid_t) pid, OOMADJ_FOREGRD_UNLOCKED);
303 ret = set_app_oomadj((pid_t) pid, OOMADJ_FOREGRD_UNLOCKED);
306 if(oomadj > OOMADJ_BACKGRD_UNLOCKED) {
307 ret = set_app_oomadj((pid_t) pid, OOMADJ_FOREGRD_UNLOCKED);
309 PRT_TRACE_EM("Unknown oomadj value (%d) !", oomadj);
318 int set_backgrd_action(int argc, char **argv)
326 if ((pid = atoi(argv[0])) < 0)
329 if (get_app_oomadj(pid, &oomadj) < 0)
333 case OOMADJ_BACKGRD_LOCKED:
334 case OOMADJ_BACKGRD_UNLOCKED:
338 case OOMADJ_FOREGRD_LOCKED:
339 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_LOCKED);
341 case OOMADJ_FOREGRD_UNLOCKED:
342 check_and_set_old_backgrd();
343 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_UNLOCKED);
346 check_and_set_old_backgrd();
347 ret = set_app_oomadj((pid_t) pid, OOMADJ_BACKGRD_UNLOCKED);
350 if(oomadj > OOMADJ_BACKGRD_UNLOCKED) {
353 PRT_TRACE_EM("Unknown oomadj value (%d) !", oomadj);
361 int ss_process_manager_init(void)
363 ss_action_entry_add_internal(PREDEF_FOREGRD, set_foregrd_action, NULL,
365 ss_action_entry_add_internal(PREDEF_BACKGRD, set_backgrd_action, NULL,
367 ss_action_entry_add_internal(PREDEF_ACTIVE, set_active_action, NULL,
369 ss_action_entry_add_internal(PREDEF_INACTIVE, set_inactive_action, NULL,
371 ss_action_entry_add_internal(OOMADJ_SET, set_oomadj_action, NULL, NULL);