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 if (running_with_asan()) { 35 ALOGW("Running with ASan, skip enforcing memory limitations."); 36 return; 37 } 38 39 long pageSize = sysconf(_SC_PAGESIZE); 40 long numPages = sysconf(_SC_PHYS_PAGES); 41 size_t maxMem = SIZE_MAX; 42 43 if (pageSize > 0 && numPages > 0) { 44 if (size_t(numPages) < SIZE_MAX / size_t(pageSize)) { 45 maxMem = size_t(numPages) * size_t(pageSize); 46 } 47 ALOGV("physMem: %zu", maxMem); 48 if (percentageOfTotalMem > 100) { 49 ALOGW("requested %zu%% of total memory, using 100%%", percentageOfTotalMem); 50 percentageOfTotalMem = 100; 51 } 52 maxMem = maxMem / 100 * percentageOfTotalMem; 53 if (numberOfBytes < maxMem) { 54 maxMem = numberOfBytes; 55 } 56 ALOGV("requested limit: %zu", maxMem); 57 } else { 58 ALOGW("couldn't determine total RAM"); 59 } 60 61 int64_t propVal = property_get_int64(property, maxMem); 62 if (propVal > 0 && uint64_t(propVal) <= SIZE_MAX) { 63 maxMem = propVal; 64 } 65 ALOGV("actual limit: %zu", maxMem); 66 67 struct rlimit limit; 68 getrlimit(RLIMIT_AS, &limit); 69 ALOGV("original limits: %lld/%lld", (long long)limit.rlim_cur, (long long)limit.rlim_max); 70 limit.rlim_cur = maxMem; 71 setrlimit(RLIMIT_AS, &limit); 72 limit.rlim_cur = -1; 73 limit.rlim_max = -1; 74 getrlimit(RLIMIT_AS, &limit); 75 ALOGV("new limits: %lld/%lld", (long long)limit.rlim_cur, (long long)limit.rlim_max); 76 77} 78 79} // namespace android 80