EphemeralStorage.cpp revision dab5fc65b92b37ee623b10f86a6ccf1709ba17d4
1dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/*
2dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Copyright (C) 2016 The Android Open Source Project
3dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
4dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * you may not use this file except in compliance with the License.
6dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * You may obtain a copy of the License at
7dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
8dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
10dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * See the License for the specific language governing permissions and
14dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * limitations under the License.
15dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber */
16dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
17dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define LOG_TAG "EphemeralStorage"
18dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber//#define LOG_NDEBUG 0
19dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
20dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <android-base/logging.h>
21dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
22dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "EphemeralStorage.h"
23dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
24dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing ::android::hardware::hidl_string;
25dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing ::android::hardware::hidl_vec;
26dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
27dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubernamespace android {
28dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
29dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberEphemeralStorage::EphemeralStorage() {
30dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
31dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
32dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberEphemeralStorage::~EphemeralStorage() {
33dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    CHECK(mItems.empty())
34dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        << "All item storage should have been released by now.";
35dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
36dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
37dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberhidl_string *EphemeralStorage::allocStringArray(size_t size) {
38dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Item item;
39dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mType = TYPE_STRING_ARRAY;
40dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mObj = NULL;
41dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mPtr = new hidl_string[size];
42dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mItems.push_back(item);
43dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
44dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return static_cast<hidl_string *>(item.mPtr);
45dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
46dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
47dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid *EphemeralStorage::allocTemporaryStorage(size_t size) {
48dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Item item;
49dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mType = TYPE_STORAGE;
50dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mObj = NULL;
51dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mPtr = malloc(size);
52dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mItems.push_back(item);
53dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
54dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return item.mPtr;
55dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
56dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
57dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberconst hidl_string *EphemeralStorage::allocTemporaryString(
58dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, jstring stringObj) {
59dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jstring obj = (jstring)env->NewGlobalRef(stringObj);
60dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const char *val = env->GetStringUTFChars(obj, NULL);
61dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
62dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Item item;
63dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mType = TYPE_STRING;
64dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mObj = obj;
65dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mPtr = (void *)val;
66dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mItems.push_back(item);
67dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
68dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hidl_string *s = allocStringArray(1 /* size */);
69dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    s->setToExternal((char *)val, strlen(val));
70dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
71dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return s;
72dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
73dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
74dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_ALLOC_ARRAY_METHODS(Suffix,Type,NewType)                        \
75dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberconst Type *EphemeralStorage::allocTemporary ## Suffix ## Array(               \
76dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, Type ## Array arrayObj) {                                 \
77dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Type ## Array obj = (Type ## Array)env->NewGlobalRef(arrayObj);            \
78dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const Type *val = env->Get ## NewType ## ArrayElements(obj, NULL);         \
79dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
80dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Item item;                                                                 \
81dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mType = TYPE_ ## Suffix ## _ARRAY;                                    \
82dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mObj = obj;                                                           \
83dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mPtr = (void *)val;                                                   \
84dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mItems.push_back(item);                                                    \
85dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
86dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return val;                                                                \
87dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
88dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
89dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_ALLOC_VECTOR_METHODS(Suffix,Type,NewType)                       \
90dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberconst hidl_vec<Type> *EphemeralStorage::allocTemporary ## Suffix ## Vector(    \
91dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        JNIEnv *env, Type ## Array arrayObj) {                                 \
92dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Type ## Array obj = (Type ## Array)env->NewGlobalRef(arrayObj);            \
93dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jsize len = env->GetArrayLength(obj);                                      \
94dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    const Type *val = env->Get ## NewType ## ArrayElements(obj, NULL);         \
95dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
96dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    Item item;                                                                 \
97dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mType = TYPE_ ## Suffix ## _ARRAY;                                    \
98dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mObj = obj;                                                           \
99dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    item.mPtr = (void *)val;                                                   \
100dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mItems.push_back(item);                                                    \
101dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
102dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    hidl_vec<Type> *vec =                                                      \
103dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        (hidl_vec<Type> *)allocTemporaryStorage(sizeof(hidl_vec<Type>));       \
104dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
105dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    vec->setToExternal(const_cast<Type *>(val), len);                          \
106dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
107dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    return vec;                                                                \
108dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
109dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
110dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_ARRAY_METHODS(Int8,jbyte,Byte)
111dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_ARRAY_METHODS(Int16,jshort,Short)
112dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_ARRAY_METHODS(Int32,jint,Int)
113dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_ARRAY_METHODS(Int64,jlong,Long)
114dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_ARRAY_METHODS(Float,jfloat,Float)
115dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_ARRAY_METHODS(Double,jdouble,Double)
116dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
117dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_VECTOR_METHODS(Int8,jbyte,Byte)
118dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_VECTOR_METHODS(Int16,jshort,Short)
119dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_VECTOR_METHODS(Int32,jint,Int)
120dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_VECTOR_METHODS(Int64,jlong,Long)
121dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_VECTOR_METHODS(Float,jfloat,Float)
122dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_ALLOC_VECTOR_METHODS(Double,jdouble,Double)
123dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
124dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_RELEASE_ARRAY_CASE(Suffix,Type,NewType)                         \
125dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            case TYPE_ ## Suffix ## _ARRAY:                                    \
126dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            {                                                                  \
127dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env->Release ## NewType ## ArrayElements(                      \
128dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                        (Type ## Array)item.mObj,                              \
129dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                        (Type *)item.mPtr,                                     \
130dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                        0 /* mode */);                                         \
131dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                                                                               \
132dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env->DeleteGlobalRef(item.mObj);                               \
133dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                break;                                                         \
134dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            }
135dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
136dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid EphemeralStorage::release(JNIEnv *env) {
137dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    for (size_t i = mItems.size(); i--;) {
138dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        const Item &item = mItems[i];
139dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
140dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        switch (item.mType) {
141dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            case TYPE_STRING_ARRAY:
142dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            {
143dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                delete[] static_cast<hidl_string *>(item.mPtr);
144dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                break;
145dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            }
146dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
147dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            case TYPE_STORAGE:
148dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            {
149dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                free(item.mPtr);
150dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                break;
151dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            }
152dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
153dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            case TYPE_STRING:
154dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            {
155dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env->ReleaseStringUTFChars(
156dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                        (jstring)item.mObj, (const char *)item.mPtr);
157dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
158dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                env->DeleteGlobalRef(item.mObj);
159dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                break;
160dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            }
161dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
162dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            DEFINE_RELEASE_ARRAY_CASE(Int8,jbyte,Byte)
163dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            DEFINE_RELEASE_ARRAY_CASE(Int16,jshort,Short)
164dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            DEFINE_RELEASE_ARRAY_CASE(Int32,jint,Int)
165dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            DEFINE_RELEASE_ARRAY_CASE(Int64,jlong,Long)
166dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            DEFINE_RELEASE_ARRAY_CASE(Float,jfloat,Float)
167dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            DEFINE_RELEASE_ARRAY_CASE(Double,jdouble,Double)
168dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
169dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            default:
170dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                CHECK(!"Should not be here");
171dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        }
172dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
173dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
174dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    mItems.clear();
175dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
176dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
177dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}  // namespace android
178dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
179