174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov/* 274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * Copyright (C) 2016 The Android Open Source Project 374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * 474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * you may not use this file except in compliance with the License. 674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * You may obtain a copy of the License at 774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * 874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * 1074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software 1174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 1274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * See the License for the specific language governing permissions and 1474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov * limitations under the License. 1574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov */ 1674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 1774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov#include <atomic> 1874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov#include <jni.h> 1974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov#include <cutils/ashmem.h> 2074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov#include <linux/ashmem.h> 2174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov#include <sys/ioctl.h> 2274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov#include <sys/mman.h> 2374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 2474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganovjint android_util_MemoryIntArrayTest_createAshmem(__attribute__((unused)) JNIEnv* env, 2574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov __attribute__((unused)) jobject clazz, 2674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov jstring name, jint size) 2774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov{ 2874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 2974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov if (name == NULL) { 3074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return -1; 3174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 3274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 3374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov if (size < 0) { 3474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return -1; 3574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 3674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 3774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov const char* nameStr = env->GetStringUTFChars(name, NULL); 3874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov const int ashmemSize = sizeof(std::atomic_int) * size; 3974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov int fd = ashmem_create_region(nameStr, ashmemSize); 4074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov env->ReleaseStringUTFChars(name, nameStr); 4174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 4274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov if (fd < 0) { 4374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return -1; 4474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 4574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 4674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov int setProtResult = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); 4774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov if (setProtResult < 0) { 4874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return -1; 4974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 5074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 5174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return fd; 5274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov} 5374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 5474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganovvoid android_util_MemoryIntArrayTest_setAshmemSize(__attribute__((unused)) JNIEnv* env, 5574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov __attribute__((unused)) jobject clazz, jint fd, jint size) 5674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov{ 5774c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov if (fd < 0) { 5874c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return; 5974c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 6074c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 6174c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov if (size < 0) { 6274c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov return; 6374c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov } 6474c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov 6574c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov ioctl(fd, ASHMEM_SET_SIZE, size); 6674c9983e80d8224bbe1de7c37e8f6ac4a76df11dSvetoslav Ganov} 67