1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17#define LOG_TAG "MediaUtils" 18#define LOG_NDEBUG 0 19#include <utils/Log.h> 20 21#include <cutils/properties.h> 22#include <sys/resource.h> 23#include <unistd.h> 24 25#include "MediaUtils.h" 26 27namespace android { 28 29void limitProcessMemory( 30 const char *property, 31 size_t numberOfBytes, 32 size_t percentageOfTotalMem) { 33 34 long pageSize = sysconf(_SC_PAGESIZE); 35 long numPages = sysconf(_SC_PHYS_PAGES); 36 size_t maxMem = SIZE_MAX; 37 38 if (pageSize > 0 && numPages > 0) { 39 if (size_t(numPages) < SIZE_MAX / size_t(pageSize)) { 40 maxMem = size_t(numPages) * size_t(pageSize); 41 } 42 ALOGV("physMem: %zu", maxMem); 43 if (percentageOfTotalMem > 100) { 44 ALOGW("requested %zu%% of total memory, using 100%%", percentageOfTotalMem); 45 percentageOfTotalMem = 100; 46 } 47 maxMem = maxMem / 100 * percentageOfTotalMem; 48 if (numberOfBytes < maxMem) { 49 maxMem = numberOfBytes; 50 } 51 ALOGV("requested limit: %zu", maxMem); 52 } else { 53 ALOGW("couldn't determine total RAM"); 54 } 55 56 int64_t propVal = property_get_int64(property, maxMem); 57 if (propVal > 0 && uint64_t(propVal) <= SIZE_MAX) { 58 maxMem = propVal; 59 } 60 ALOGV("actual limit: %zu", maxMem); 61 62 struct rlimit limit; 63 getrlimit(RLIMIT_AS, &limit); 64 ALOGV("original limits: %lld/%lld", (long long)limit.rlim_cur, (long long)limit.rlim_max); 65 limit.rlim_cur = maxMem; 66 setrlimit(RLIMIT_AS, &limit); 67 limit.rlim_cur = -1; 68 limit.rlim_max = -1; 69 getrlimit(RLIMIT_AS, &limit); 70 ALOGV("new limits: %lld/%lld", (long long)limit.rlim_cur, (long long)limit.rlim_max); 71 72} 73 74} // namespace android 75