Fixing logging in Vehicle HAL, code clean up
Test: this just refactoring, verified existing tests still passing
Change-Id: I70ad3928f9fe6b2f6c677b4d6848f263f3c25d11
Fix: b/33297409
diff --git a/vehicle/2.0/default/Android.mk b/vehicle/2.0/default/Android.mk
index e61aaa3..4a27eeb 100644
--- a/vehicle/2.0/default/Android.mk
+++ b/vehicle/2.0/default/Android.mk
@@ -25,13 +25,15 @@
vehicle_hal_manager/AccessControlConfigParser.cpp \
vehicle_hal_manager/SubscriptionManager.cpp \
vehicle_hal_manager/VehicleHalManager.cpp \
+ vehicle_hal_manager/VehicleObjectPool.cpp \
+ vehicle_hal_manager/VehicleUtils.cpp \
LOCAL_SHARED_LIBRARIES := \
- liblog \
libbinder \
libhidlbase \
libhidltransport \
libhwbinder \
+ liblog \
libutils \
$(module_prefix) \
@@ -47,11 +49,11 @@
impl/DefaultVehicleHal.cpp \
LOCAL_SHARED_LIBRARIES := \
- liblog \
libbinder \
libhidlbase \
libhidltransport \
libhwbinder \
+ liblog \
libutils \
$(module_prefix) \
@@ -69,17 +71,17 @@
LOCAL_SRC_FILES:= \
tests/AccessControlConfigParser_test.cpp \
- tests/VehicleObjectPool_test.cpp \
- tests/VehiclePropConfigIndex_test.cpp \
tests/SubscriptionManager_test.cpp \
tests/VehicleHalManager_test.cpp \
+ tests/VehicleObjectPool_test.cpp \
+ tests/VehiclePropConfigIndex_test.cpp \
LOCAL_SHARED_LIBRARIES := \
- liblog \
libbinder \
libhidlbase \
libhidltransport \
libhwbinder \
+ liblog \
libutils \
$(module_prefix) \
@@ -105,11 +107,11 @@
$(module_prefix)-default-impl-lib \
LOCAL_SHARED_LIBRARIES := \
- liblog \
libbinder \
libhidlbase \
libhidltransport \
libhwbinder \
+ liblog \
libutils \
android.hardware.vehicle@2.0
diff --git a/vehicle/2.0/default/impl/DefaultConfig.h b/vehicle/2.0/default/impl/DefaultConfig.h
index b1c49c8..e4ca5ca 100644
--- a/vehicle/2.0/default/impl/DefaultConfig.h
+++ b/vehicle/2.0/default/impl/DefaultConfig.h
@@ -83,12 +83,13 @@
.changeMode = VehiclePropertyChangeMode::ON_CHANGE,
.permissionModel = VehiclePermissionModel::NO_RESTRICTION,
.supportedAreas = toInt(VehicleAreaZone::ROW_1),
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .areaId = toInt(VehicleAreaZone::ROW_1),
- .minInt32Value = 1,
- .maxInt32Value = 7
- }})
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .areaId = toInt(VehicleAreaZone::ROW_1),
+ .minInt32Value = 1,
+ .maxInt32Value = 7
+ }
+ }
},
{
@@ -107,7 +108,7 @@
.supportedAreas =
VehicleAreaZone::ROW_1_LEFT
| VehicleAreaZone::ROW_1_RIGHT,
- .areaConfigs = init_hidl_vec({
+ .areaConfigs = {
VehicleAreaConfig {
.areaId = toInt(VehicleAreaZone::ROW_1_LEFT),
.minFloatValue = 16,
@@ -117,7 +118,8 @@
.areaId = toInt(VehicleAreaZone::ROW_1_RIGHT),
.minFloatValue = 16,
.maxFloatValue = 32,
- }})
+ }
+ }
},
{
@@ -146,12 +148,12 @@
.access = VehiclePropertyAccess::READ,
.changeMode = VehiclePropertyChangeMode::ON_CHANGE,
.permissionModel = VehiclePermissionModel::OEM_ONLY,
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .minFloatValue = 0,
- .maxFloatValue = 1.0
- }
- })
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .minFloatValue = 0,
+ .maxFloatValue = 1.0
+ }
+ }
},
{
@@ -159,12 +161,12 @@
.access = VehiclePropertyAccess::READ_WRITE,
.changeMode = VehiclePropertyChangeMode::ON_CHANGE,
.permissionModel = VehiclePermissionModel::OEM_ONLY,
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .minInt32Value = 0,
- .maxInt32Value = 10
- }
- })
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .minInt32Value = 0,
+ .maxInt32Value = 10
+ }
+ }
}
};
diff --git a/vehicle/2.0/default/tests/SubscriptionManager_test.cpp b/vehicle/2.0/default/tests/SubscriptionManager_test.cpp
index 171a692..863142e 100644
--- a/vehicle/2.0/default/tests/SubscriptionManager_test.cpp
+++ b/vehicle/2.0/default/tests/SubscriptionManager_test.cpp
@@ -43,35 +43,32 @@
sp<IVehicleCallback> cb2 = new MockedVehicleCallback();
sp<IVehicleCallback> cb3 = new MockedVehicleCallback();
- hidl_vec<SubscribeOptions> subscrToProp1 = init_hidl_vec(
- {
- SubscribeOptions {
- .propId = PROP1,
- .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
- .flags = SubscribeFlags::HAL_EVENT
- },
- });
+ hidl_vec<SubscribeOptions> subscrToProp1 = {
+ SubscribeOptions {
+ .propId = PROP1,
+ .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
+ .flags = SubscribeFlags::HAL_EVENT
+ },
+ };
- hidl_vec<SubscribeOptions> subscrToProp2 = init_hidl_vec(
- {
- SubscribeOptions {
- .propId = PROP2,
- .flags = SubscribeFlags::HAL_EVENT
- },
- });
+ hidl_vec<SubscribeOptions> subscrToProp2 = {
+ SubscribeOptions {
+ .propId = PROP2,
+ .flags = SubscribeFlags::HAL_EVENT
+ },
+ };
- hidl_vec<SubscribeOptions> subscrToProp1and2 = init_hidl_vec(
- {
- SubscribeOptions {
- .propId = PROP1,
- .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
- .flags = SubscribeFlags::HAL_EVENT
- },
- SubscribeOptions {
- .propId = PROP2,
- .flags = SubscribeFlags::HAL_EVENT
- },
- });
+ hidl_vec<SubscribeOptions> subscrToProp1and2 = {
+ SubscribeOptions {
+ .propId = PROP1,
+ .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
+ .flags = SubscribeFlags::HAL_EVENT
+ },
+ SubscribeOptions {
+ .propId = PROP2,
+ .flags = SubscribeFlags::HAL_EVENT
+ },
+ };
static std::list<sp<IVehicleCallback>> extractCallbacks(
const std::list<sp<HalClient>>& clients) {
@@ -144,14 +141,13 @@
// Same property, but different zone, to make sure we didn't unsubscribe
// from previous zone.
- manager.addOrUpdateSubscription(cb1, init_hidl_vec(
- {
- SubscribeOptions {
+ manager.addOrUpdateSubscription(cb1, {
+ SubscribeOptions {
.propId = PROP1,
.vehicleAreas = toInt(VehicleAreaZone::ROW_2),
.flags = SubscribeFlags::DEFAULT
}
- }));
+ });
clients = manager.getSubscribedClients(PROP1,
toInt(VehicleAreaZone::ROW_1_LEFT),
diff --git a/vehicle/2.0/default/tests/VehicleHalManager_test.cpp b/vehicle/2.0/default/tests/VehicleHalManager_test.cpp
index d06f6f4..964c7c8 100644
--- a/vehicle/2.0/default/tests/VehicleHalManager_test.cpp
+++ b/vehicle/2.0/default/tests/VehicleHalManager_test.cpp
@@ -182,8 +182,8 @@
};
TEST_F(VehicleHalManagerTest, getPropConfigs) {
- hidl_vec<VehicleProperty> properties = init_hidl_vec(
- { VehicleProperty::HVAC_FAN_SPEED,VehicleProperty::INFO_MAKE} );
+ hidl_vec<VehicleProperty> properties =
+ { VehicleProperty::HVAC_FAN_SPEED, VehicleProperty::INFO_MAKE };
bool called = false;
manager->getPropConfigs(properties,
@@ -197,7 +197,7 @@
ASSERT_TRUE(called); // Verify callback received.
called = false;
- manager->getPropConfigs(init_hidl_vec({VehicleProperty::HVAC_FAN_SPEED}),
+ manager->getPropConfigs({ VehicleProperty::HVAC_FAN_SPEED },
[&called] (StatusCode status,
const hidl_vec<VehiclePropConfig>& c) {
ASSERT_EQ(StatusCode::OK, status);
@@ -230,13 +230,12 @@
sp<MockedVehicleCallback> cb = new MockedVehicleCallback();
- hidl_vec<SubscribeOptions> options = init_hidl_vec(
- {
- SubscribeOptions {
- .propId = PROP,
- .flags = SubscribeFlags::DEFAULT
- },
- });
+ hidl_vec<SubscribeOptions> options = {
+ SubscribeOptions {
+ .propId = PROP,
+ .flags = SubscribeFlags::DEFAULT
+ },
+ };
StatusCode res = manager->subscribe(cb, options);
ASSERT_EQ(StatusCode::OK, res);
@@ -249,13 +248,12 @@
sp<MockedVehicleCallback> cb = new MockedVehicleCallback();
- hidl_vec<SubscribeOptions> options = init_hidl_vec(
- {
- SubscribeOptions {
- .propId = PROP,
- .flags = SubscribeFlags::DEFAULT
- },
- });
+ hidl_vec<SubscribeOptions> options = {
+ SubscribeOptions {
+ .propId = PROP,
+ .flags = SubscribeFlags::DEFAULT
+ }
+ };
StatusCode res = manager->subscribe(cb, options);
ASSERT_EQ(StatusCode::OK, res);
@@ -291,13 +289,12 @@
sp<MockedVehicleCallback> cb = new MockedVehicleCallback();
- hidl_vec<SubscribeOptions> options = init_hidl_vec(
- {
- SubscribeOptions {
- .propId = PROP,
- .flags = SubscribeFlags::HAL_EVENT
- },
- });
+ hidl_vec<SubscribeOptions> options = {
+ SubscribeOptions {
+ .propId = PROP,
+ .flags = SubscribeFlags::HAL_EVENT
+ },
+ };
StatusCode res = manager->subscribe(cb, options);
// Unable to subscribe on Hal Events for write-only properties.
diff --git a/vehicle/2.0/default/tests/VehicleHalTestUtils.h b/vehicle/2.0/default/tests/VehicleHalTestUtils.h
index 16d0be9..586b5ab 100644
--- a/vehicle/2.0/default/tests/VehicleHalTestUtils.h
+++ b/vehicle/2.0/default/tests/VehicleHalTestUtils.h
@@ -43,17 +43,17 @@
.permissionModel = VehiclePermissionModel::NO_RESTRICTION,
.supportedAreas = static_cast<int32_t>(
VehicleAreaZone::ROW_1_LEFT | VehicleAreaZone::ROW_1_RIGHT),
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .areaId = toInt(VehicleAreaZone::ROW_1_LEFT),
- .minInt32Value = 1,
- .maxInt32Value = 7},
- VehicleAreaConfig {
- .areaId = toInt(VehicleAreaZone::ROW_1_RIGHT),
- .minInt32Value = 1,
- .maxInt32Value = 5,
- }
- }),
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .areaId = toInt(VehicleAreaZone::ROW_1_LEFT),
+ .minInt32Value = 1,
+ .maxInt32Value = 7},
+ VehicleAreaConfig {
+ .areaId = toInt(VehicleAreaZone::ROW_1_RIGHT),
+ .minInt32Value = 1,
+ .maxInt32Value = 5,
+ }
+ }
},
// Write-only property
@@ -64,17 +64,17 @@
.permissionModel = VehiclePermissionModel::NO_RESTRICTION,
.supportedAreas = static_cast<int32_t>(
VehicleAreaZone::ROW_1_LEFT | VehicleAreaZone::ROW_1_RIGHT),
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .areaId = toInt(VehicleAreaZone::ROW_1_LEFT),
- .minInt32Value = 64,
- .maxInt32Value = 80},
- VehicleAreaConfig {
- .areaId = toInt(VehicleAreaZone::ROW_1_RIGHT),
- .minInt32Value = 64,
- .maxInt32Value = 80,
- }
- }),
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .areaId = toInt(VehicleAreaZone::ROW_1_LEFT),
+ .minInt32Value = 64,
+ .maxInt32Value = 80},
+ VehicleAreaConfig {
+ .areaId = toInt(VehicleAreaZone::ROW_1_RIGHT),
+ .minInt32Value = 64,
+ .maxInt32Value = 80,
+ }
+ }
},
{
@@ -82,12 +82,12 @@
.access = VehiclePropertyAccess::READ,
.changeMode = VehiclePropertyChangeMode::ON_CHANGE,
.permissionModel = VehiclePermissionModel::OEM_ONLY,
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .minFloatValue = 0,
- .maxFloatValue = 1.0
- }
- })
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .minFloatValue = 0,
+ .maxFloatValue = 1.0
+ }
+ }
},
{
@@ -95,12 +95,12 @@
.access = VehiclePropertyAccess::READ_WRITE,
.changeMode = VehiclePropertyChangeMode::ON_CHANGE,
.permissionModel = VehiclePermissionModel::OEM_ONLY,
- .areaConfigs = init_hidl_vec({
- VehicleAreaConfig {
- .minInt32Value = 0,
- .maxInt32Value = 10
- }
- })
+ .areaConfigs = {
+ VehicleAreaConfig {
+ .minInt32Value = 0,
+ .maxInt32Value = 10
+ }
+ }
},
{
diff --git a/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.cpp b/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.cpp
index 1d436c5..d6458c2 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.cpp
+++ b/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.cpp
@@ -15,13 +15,14 @@
*/
#define LOG_TAG "android.hardware.vehicle@2.0-impl"
-#include <android/log.h>
+
+#include "AccessControlConfigParser.h"
#include <fstream>
#include <sstream>
#include <iostream>
-#include "AccessControlConfigParser.h"
+#include <android/log.h>
namespace android {
namespace hardware {
diff --git a/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.h b/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.h
index 17cbbd6..5cd0c3e 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.h
+++ b/vehicle/2.0/default/vehicle_hal_manager/AccessControlConfigParser.h
@@ -21,6 +21,7 @@
#include <vector>
#include <unordered_map>
#include <list>
+
#include <android/hardware/vehicle/2.0/types.h>
namespace android {
diff --git a/vehicle/2.0/default/vehicle_hal_manager/SubscriptionManager.cpp b/vehicle/2.0/default/vehicle_hal_manager/SubscriptionManager.cpp
index 910413e..c190c71 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/SubscriptionManager.cpp
+++ b/vehicle/2.0/default/vehicle_hal_manager/SubscriptionManager.cpp
@@ -16,12 +16,13 @@
#define LOG_TAG "android.hardware.vehicle@2.0-impl"
+#include "SubscriptionManager.h"
+
#include <cmath>
-#include <utils/Errors.h>
+#include <android/log.h>
#include "VehicleUtils.h"
-#include "SubscriptionManager.h"
namespace android {
namespace hardware {
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp
index 267c515..b4eb484 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp
@@ -13,19 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
#define LOG_TAG "android.hardware.vehicle@2.0-impl"
-#include <cmath>
+#include "VehicleHalManager.h"
-#include <utils/Errors.h>
-#include <android/log.h>
-#include <hidl/Status.h>
-#include <future>
-#include <bitset>
#include <fstream>
+
+#include <android/log.h>
#include <private/android_filesystem_config.h>
-#include "VehicleHalManager.h"
+#include "VehicleUtils.h"
namespace android {
namespace hardware {
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h
index cb846c9..519b09b 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h
@@ -17,24 +17,24 @@
#ifndef android_hardware_vehicle_V2_0_VehicleHalManager_H_
#define android_hardware_vehicle_V2_0_VehicleHalManager_H_
-#include <stdint.h>
#include <inttypes.h>
+#include <stdint.h>
#include <sys/types.h>
-#include <memory>
-#include <map>
-#include <set>
-#include <list>
-#include <hwbinder/IPCThreadState.h>
+#include <list>
+#include <map>
+#include <memory>
+#include <set>
#include <android/hardware/vehicle/2.0/IVehicle.h>
+#include <hwbinder/IPCThreadState.h>
#include "AccessControlConfigParser.h"
#include "ConcurrentQueue.h"
#include "SubscriptionManager.h"
#include "VehicleHal.h"
-#include "VehiclePropConfigIndex.h"
#include "VehicleObjectPool.h"
+#include "VehiclePropConfigIndex.h"
namespace android {
namespace hardware {
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.cpp b/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.cpp
new file mode 100644
index 0000000..70b93e7
--- /dev/null
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.cpp
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "android.hardware.vehicle@2.0-impl"
+
+#include "VehicleObjectPool.h"
+
+#include <android/log.h>
+
+#include "VehicleUtils.h"
+
+namespace android {
+namespace hardware {
+namespace vehicle {
+namespace V2_0 {
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtain(
+ VehiclePropertyType type, size_t vecSize) {
+ return isDisposable(type, vecSize)
+ ? obtainDisposable(type, vecSize)
+ : obtainRecylable(type, vecSize);
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtain(
+ const VehiclePropValue& src) {
+ if (src.prop == VehicleProperty::INVALID) {
+ ALOGE("Unable to obtain an object from pool for unknown property");
+ return RecyclableType();
+ }
+ VehiclePropertyType type = getPropType(src.prop);
+ size_t vecSize = getVehicleRawValueVectorSize(src.value, type);;
+ auto dest = obtain(type, vecSize);
+
+ dest->prop = src.prop;
+ dest->areaId = src.areaId;
+ dest->timestamp = src.timestamp;
+ copyVehicleRawValue(&dest->value, src.value);
+
+ return dest;
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainInt32(
+ int32_t value) {
+ auto val = obtain(VehiclePropertyType::INT32);
+ val->value.int32Values[0] = value;
+ return val;
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainInt64(
+ int64_t value) {
+ auto val = obtain(VehiclePropertyType::INT64);
+ val->value.int64Values[0] = value;
+ return val;
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainFloat(
+ float value) {
+ auto val = obtain(VehiclePropertyType::FLOAT);
+ val->value.floatValues[0] = value;
+ return val;
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainString(
+ const char* cstr) {
+ auto val = obtain(VehiclePropertyType::STRING);
+ val->value.stringValue = cstr;
+ return val;
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainRecylable(
+ VehiclePropertyType type, size_t vecSize) {
+ // VehiclePropertyType is not overlapping with vectorSize.
+ int32_t key = static_cast<int32_t>(type)
+ | static_cast<int32_t>(vecSize);
+
+ std::lock_guard<std::mutex> g(mLock);
+ auto it = mValueTypePools.find(key);
+
+ if (it == mValueTypePools.end()) {
+ auto newPool(std::make_unique<InternalPool>(type, vecSize));
+ it = mValueTypePools.emplace(key, std::move(newPool)).first;
+ }
+ return it->second->obtain();
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainBoolean(
+ bool value) {
+ return obtainInt32(value);
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtainDisposable(
+ VehiclePropertyType valueType, size_t vectorSize) const {
+ return RecyclableType {
+ createVehiclePropValue(valueType, vectorSize).release(),
+ mDisposableDeleter
+ };
+}
+
+VehiclePropValuePool::RecyclableType VehiclePropValuePool::obtain(
+ VehiclePropertyType type) {
+ return obtain(type, 1);
+}
+
+
+void VehiclePropValuePool::InternalPool::recycle(VehiclePropValue* o) {
+ if (o == nullptr) {
+ ALOGE("Attempt to recycle nullptr");
+ return;
+ }
+
+ if (!check(&o->value)) {
+ ALOGE("Discarding value for prop 0x%x because it contains "
+ "data that is not consistent with this pool. "
+ "Expected type: %d, vector size: %d",
+ o->prop, mPropType, mVectorSize);
+ delete o;
+ } else {
+ ObjectPool<VehiclePropValue>::recycle(o);
+ }
+}
+
+bool VehiclePropValuePool::InternalPool::check(VehiclePropValue::RawValue* v) {
+ return check(&v->int32Values,
+ (VehiclePropertyType::INT32 == mPropType
+ || VehiclePropertyType::INT32_VEC == mPropType
+ || VehiclePropertyType::BOOLEAN == mPropType))
+ && check(&v->floatValues,
+ (VehiclePropertyType::FLOAT == mPropType
+ || VehiclePropertyType::FLOAT_VEC == mPropType))
+ && check(&v->int64Values,
+ VehiclePropertyType::INT64 == mPropType)
+ && check(&v->bytes,
+ VehiclePropertyType::BYTES == mPropType)
+ && v->stringValue.size() == 0;
+}
+
+VehiclePropValue* VehiclePropValuePool::InternalPool::createObject() {
+ return createVehiclePropValue(mPropType, mVectorSize).release();
+}
+
+} // namespace V2_0
+} // namespace vehicle
+} // namespace hardware
+} // namespace android
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.h b/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.h
index 0029380..1ca9211 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.h
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleObjectPool.h
@@ -18,19 +18,10 @@
#ifndef android_hardware_vehicle_V2_0_VehicleObjectPool_H_
#define android_hardware_vehicle_V2_0_VehicleObjectPool_H_
-#include "VehicleUtils.h" // defines LOG_TAG and includes <android/log.h>
-
-#include <iostream>
-#include <memory>
#include <deque>
-#include <string>
#include <map>
#include <mutex>
-#ifndef LOG_TAG
-#define LOG_TAG "android.hardware.vehicle@2.0-impl"
-#endif
-#include <android/log.h>
#include <android/hardware/vehicle/2.0/types.h>
namespace android {
@@ -38,8 +29,6 @@
namespace vehicle {
namespace V2_0 {
-using android::hardware::hidl_vec;
-
// Handy metric mostly for unit tests and debug.
#define INC_METRIC_IF_DEBUG(val) PoolStats::instance()->val++;
struct PoolStats {
@@ -53,6 +42,29 @@
}
};
+template<typename T>
+struct Deleter {
+ using OnDeleteFunc = std::function<void(T*)>;
+
+ Deleter(const OnDeleteFunc& f) : mOnDelete(f) {};
+
+ Deleter() = default;
+ Deleter(const Deleter&) = default;
+
+ void operator()(T* o) {
+ mOnDelete(o);
+ }
+private:
+ OnDeleteFunc mOnDelete;
+};
+
+/**
+ * This is std::unique_ptr<> with custom delete operation that typically moves
+ * the pointer it holds back to ObjectPool.
+ */
+template <typename T>
+using recyclable_ptr = typename std::unique_ptr<T, Deleter<T>>;
+
/**
* Generic abstract object pool class. Users of this class must implement
* #createObject method.
@@ -68,24 +80,7 @@
ObjectPool() = default;
virtual ~ObjectPool() = default;
- struct Deleter {
- using OnDeleteFunc = std::function<void(T*)>;
-
- Deleter(const OnDeleteFunc& f) : mOnDelete(f) {};
-
- Deleter() = default;
- Deleter(const Deleter&) = default;
-
- void operator()(T* o) {
- mOnDelete(o);
- }
- private:
- OnDeleteFunc mOnDelete;
- };
-
- using RecyclableType = std::unique_ptr<T, Deleter>;
-
- virtual RecyclableType obtain() {
+ virtual recyclable_ptr<T> obtain() {
std::lock_guard<std::mutex> g(mLock);
INC_METRIC_IF_DEBUG(Obtained)
if (mObjects.empty()) {
@@ -112,34 +107,26 @@
}
private:
- const Deleter& getDeleter() {
+ const Deleter<T>& getDeleter() {
if (!mDeleter.get()) {
- Deleter *d = new Deleter(std::bind(&ObjectPool::recycle,
- this,
- std::placeholders::_1));
+ Deleter<T> *d = new Deleter<T>(std::bind(
+ &ObjectPool::recycle, this, std::placeholders::_1));
mDeleter.reset(d);
}
return *mDeleter.get();
}
- RecyclableType wrap(T* raw) {
- return RecyclableType { raw, getDeleter() };
+ recyclable_ptr<T> wrap(T* raw) {
+ return recyclable_ptr<T> { raw, getDeleter() };
}
private:
mutable std::mutex mLock;
std::deque<std::unique_ptr<T>> mObjects;
- std::unique_ptr<Deleter> mDeleter;
+ std::unique_ptr<Deleter<T>> mDeleter;
};
/**
- * This is std::unique_ptr<> with custom delete operation that typically moves
- * the pointer it holds back to ObectPool.
- */
-template <typename T>
-using recyclable_ptr = typename ObjectPool<T>::RecyclableType;
-
-/**
* This class provides a pool of recycable VehiclePropertyValue objects.
*
* It has only one overloaded public method - obtain(...), users must call this
@@ -186,66 +173,20 @@
*
*/
VehiclePropValuePool(size_t maxRecyclableVectorSize = 4) :
- mMaxRecyclableVectorSize(maxRecyclableVectorSize) { };
+ mMaxRecyclableVectorSize(maxRecyclableVectorSize) {};
- RecyclableType obtain(VehiclePropertyType type) {
- return obtain(type, 1);
- }
+ RecyclableType obtain(VehiclePropertyType type);
- RecyclableType obtain(VehiclePropertyType type, size_t vecSize) {
- return isDisposable(type, vecSize)
- ? obtainDisposable(type, vecSize)
- : obtainRecylable(type, vecSize);
- }
-
- RecyclableType obtain(const VehiclePropValue& src) {
- if (src.prop == VehicleProperty::INVALID) {
- ALOGE("Unable to obtain an object from pool for unknown property");
- return RecyclableType();
- }
- VehiclePropertyType type = getPropType(src.prop);
- size_t vecSize = getVehicleRawValueVectorSize(src.value, type);;
- auto dest = obtain(type, vecSize);
-
- dest->prop = src.prop;
- dest->areaId = src.areaId;
- dest->timestamp = src.timestamp;
- copyVehicleRawValue(&dest->value, src.value);
-
- return dest;
- }
-
- RecyclableType obtainBoolean(bool value) {
- return obtainInt32(value);
- }
-
- RecyclableType obtainInt32(int32_t value) {
- auto val = obtain(VehiclePropertyType::INT32);
- val->value.int32Values[0] = value;
- return val;
- }
-
- RecyclableType obtainInt64(int64_t value) {
- auto val = obtain(VehiclePropertyType::INT64);
- val->value.int64Values[0] = value;
- return val;
- }
-
- RecyclableType obtainFloat(float value) {
- auto val = obtain(VehiclePropertyType::FLOAT);
- val->value.floatValues[0] = value;
- return val;
- }
-
- RecyclableType obtainString(const char* cstr) {
- auto val = obtain(VehiclePropertyType::STRING);
- val->value.stringValue = cstr;
- return val;
- }
+ RecyclableType obtain(VehiclePropertyType type, size_t vecSize);
+ RecyclableType obtain(const VehiclePropValue& src);
+ RecyclableType obtainBoolean(bool value);
+ RecyclableType obtainInt32(int32_t value);
+ RecyclableType obtainInt64(int64_t value);
+ RecyclableType obtainFloat(float value);
+ RecyclableType obtainString(const char* cstr);
VehiclePropValuePool(VehiclePropValuePool& ) = delete;
VehiclePropValuePool& operator=(VehiclePropValuePool&) = delete;
-
private:
bool isDisposable(VehiclePropertyType type, size_t vecSize) const {
return vecSize > mMaxRecyclableVectorSize ||
@@ -253,70 +194,23 @@
}
RecyclableType obtainDisposable(VehiclePropertyType valueType,
- size_t vectorSize) const {
- return RecyclableType {
- createVehiclePropValue(valueType, vectorSize).release(),
- mDisposableDeleter
- };
- }
-
- RecyclableType obtainRecylable(VehiclePropertyType type, size_t vecSize) {
- // VehiclePropertyType is not overlapping with vectorSize.
- int32_t key = static_cast<int32_t>(type)
- | static_cast<int32_t>(vecSize);
-
- std::lock_guard<std::mutex> g(mLock);
- auto it = mValueTypePools.find(key);
-
- if (it == mValueTypePools.end()) {
- auto newPool(std::make_unique<InternalPool>(type, vecSize));
- it = mValueTypePools.emplace(key, std::move(newPool)).first;
- }
- return it->second->obtain();
- }
+ size_t vectorSize) const;
+ RecyclableType obtainRecylable(VehiclePropertyType type,
+ size_t vecSize);
class InternalPool: public ObjectPool<VehiclePropValue> {
public:
InternalPool(VehiclePropertyType type, size_t vectorSize)
- : mPropType(type), mVectorSize(vectorSize) {
- }
+ : mPropType(type), mVectorSize(vectorSize) {}
RecyclableType obtain() {
return ObjectPool<VehiclePropValue>::obtain();
}
protected:
- VehiclePropValue* createObject() override {
- return createVehiclePropValue(mPropType, mVectorSize).release();
- }
-
- void recycle(VehiclePropValue* o) override {
- ALOGE_IF(o == nullptr, "Attempt to recycle nullptr");
-
- if (!check(&o->value)) {
- ALOGE("Discarding value for prop 0x%x because it contains "
- "data that is not consistent with this pool. "
- "Expected type: %d, vector size: %d",
- o->prop, mPropType, mVectorSize);
- delete o;
- }
- ObjectPool<VehiclePropValue>::recycle(o);
- }
-
+ VehiclePropValue* createObject() override;
+ void recycle(VehiclePropValue* o) override;
private:
- bool check(VehiclePropValue::RawValue* v) {
- return check(&v->int32Values,
- (VehiclePropertyType::INT32 == mPropType
- || VehiclePropertyType::INT32_VEC == mPropType
- || VehiclePropertyType::BOOLEAN == mPropType))
- && check(&v->floatValues,
- (VehiclePropertyType::FLOAT == mPropType
- || VehiclePropertyType::FLOAT_VEC == mPropType))
- && check(&v->int64Values,
- VehiclePropertyType::INT64 == mPropType)
- && check(&v->bytes,
- VehiclePropertyType::BYTES == mPropType)
- && v->stringValue.size() == 0;
- }
+ bool check(VehiclePropValue::RawValue* v);
template <typename VecType>
bool check(hidl_vec<VecType>* vec, bool expected) {
@@ -328,7 +222,7 @@
};
private:
- const ObjectPool<VehiclePropValue>::Deleter mDisposableDeleter {
+ const Deleter<VehiclePropValue> mDisposableDeleter {
[] (VehiclePropValue* v) {
delete v;
}
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.cpp b/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.cpp
new file mode 100644
index 0000000..c461833
--- /dev/null
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "android.hardware.vehicle@2.0-impl"
+
+#include "VehicleUtils.h"
+
+#include <android/log.h>
+
+namespace android {
+namespace hardware {
+namespace vehicle {
+namespace V2_0 {
+
+//namespace utils {
+
+std::unique_ptr<VehiclePropValue> createVehiclePropValue(
+ VehiclePropertyType type, size_t vecSize) {
+ auto val = std::unique_ptr<VehiclePropValue>(new VehiclePropValue);
+ switch (type) {
+ case VehiclePropertyType::INT32: // fall through
+ case VehiclePropertyType::INT32_VEC: // fall through
+ case VehiclePropertyType::BOOLEAN:
+ val->value.int32Values.resize(vecSize);
+ break;
+ case VehiclePropertyType::FLOAT: // fall through
+ case VehiclePropertyType::FLOAT_VEC:
+ val->value.floatValues.resize(vecSize);
+ break;
+ case VehiclePropertyType::INT64:
+ val->value.int64Values.resize(vecSize);
+ break;
+ case VehiclePropertyType::BYTES:
+ val->value.bytes.resize(vecSize);
+ break;
+ case VehiclePropertyType::STRING:
+ break; // Valid, but nothing to do.
+ default:
+ ALOGE("createVehiclePropValue: unknown type: %d", type);
+ val.reset(nullptr);
+ }
+ return val;
+}
+
+size_t getVehicleRawValueVectorSize(
+ const VehiclePropValue::RawValue& value, VehiclePropertyType type) {
+ switch (type) {
+ case VehiclePropertyType::INT32: // fall through
+ case VehiclePropertyType::INT32_VEC: // fall through
+ case VehiclePropertyType::BOOLEAN:
+ return value.int32Values.size();
+ case VehiclePropertyType::FLOAT: // fall through
+ case VehiclePropertyType::FLOAT_VEC:
+ return value.floatValues.size();
+ case VehiclePropertyType::INT64:
+ return value.int64Values.size();
+ case VehiclePropertyType::BYTES:
+ return value.bytes.size();
+ default:
+ return 0;
+ }
+}
+
+template<typename T>
+inline void copyHidlVec(hidl_vec <T>* dest, const hidl_vec <T>& src) {
+ for (size_t i = 0; i < std::min(dest->size(), src.size()); i++) {
+ (*dest)[i] = src[i];
+ }
+}
+
+void copyVehicleRawValue(VehiclePropValue::RawValue* dest,
+ const VehiclePropValue::RawValue& src) {
+ dest->int32Values = src.int32Values;
+ dest->floatValues = src.floatValues;
+ dest->int64Values = src.int64Values;
+ dest->bytes = src.bytes;
+ dest->stringValue = src.stringValue;
+}
+
+template<typename T>
+void shallowCopyHidlVec(hidl_vec <T>* dest, const hidl_vec <T>& src) {
+ if (src.size() > 0) {
+ dest->setToExternal(const_cast<T*>(&src[0]), src.size());
+ } else if (dest->size() > 0) {
+ dest->resize(0);
+ }
+}
+
+void shallowCopyHidlStr(hidl_string* dest, const hidl_string& src) {
+ if (!src.empty()) {
+ dest->setToExternal(src.c_str(), src.size());
+ } else if (dest->size() > 0) {
+ dest->setToExternal(0, 0);
+ }
+}
+
+void shallowCopy(VehiclePropValue* dest, const VehiclePropValue& src) {
+ dest->prop = src.prop;
+ dest->areaId = src.areaId;
+ dest->timestamp = src.timestamp;
+ shallowCopyHidlVec(&dest->value.int32Values, src.value.int32Values);
+ shallowCopyHidlVec(&dest->value.int64Values, src.value.int64Values);
+ shallowCopyHidlVec(&dest->value.floatValues, src.value.floatValues);
+ shallowCopyHidlVec(&dest->value.bytes, src.value.bytes);
+ shallowCopyHidlStr(&dest->value.stringValue, src.value.stringValue);
+}
+
+
+//} // namespace utils
+
+} // namespace V2_0
+} // namespace vehicle
+} // namespace hardware
+} // namespace android
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.h b/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.h
index f06e97e..1177ddd 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.h
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleUtils.h
@@ -17,11 +17,6 @@
#ifndef android_hardware_vehicle_V2_0_VehicleUtils_H_
#define android_hardware_vehicle_V2_0_VehicleUtils_H_
-#ifndef LOG_TAG
-#define LOG_TAG "android.hardware.vehicle@2.0-impl"
-#endif
-#include <android/log.h>
-
#include <memory>
#include <hidl/HidlSupport.h>
@@ -36,43 +31,22 @@
/** Represents all supported areas for a property. Can be used is */
constexpr int32_t kAllSupportedAreas = 0;
-template <typename T>
-inline hidl_vec<T> init_hidl_vec(std::initializer_list<const T> values) {
- hidl_vec<T> vector;
- vector.resize(values.size());
- size_t i = 0;
- for (auto& c : values) {
- vector[i++] = c;
- }
- return vector;
-}
-
-/**
- * Logical 'and' operator for class enums. The return type will be enum's
- * underline type
- */
-template <typename ENUM>
-inline typename std::underlying_type<ENUM>::type operator &(ENUM v1, ENUM v2) {
- return static_cast<typename std::underlying_type<ENUM>::type>(v1)
- & static_cast<typename std::underlying_type<ENUM>::type>(v2);
-}
-
/** Returns underlying (integer) value for given enum. */
-template <typename ENUM>
+template<typename ENUM>
inline typename std::underlying_type<ENUM>::type toInt(ENUM const value) {
return static_cast<typename std::underlying_type<ENUM>::type>(value);
}
inline VehiclePropertyType getPropType(VehicleProperty prop) {
return static_cast<VehiclePropertyType>(
- static_cast<int32_t>(prop)
- & static_cast<int32_t>(VehiclePropertyType::MASK));
+ static_cast<int32_t>(prop)
+ & static_cast<int32_t>(VehiclePropertyType::MASK));
}
inline VehiclePropertyGroup getPropGroup(VehicleProperty prop) {
return static_cast<VehiclePropertyGroup>(
- static_cast<int32_t>(prop)
- & static_cast<int32_t>(VehiclePropertyGroup::MASK));
+ static_cast<int32_t>(prop)
+ & static_cast<int32_t>(VehiclePropertyGroup::MASK));
}
inline VehicleArea getPropArea(VehicleProperty prop) {
@@ -84,106 +58,25 @@
return getPropArea(prop) == VehicleArea::GLOBAL;
}
-inline bool checkPropType(VehicleProperty prop, VehiclePropertyType type) {
- return getPropType(prop) == type;
-}
-
inline bool isSystemProperty(VehicleProperty prop) {
return VehiclePropertyGroup::SYSTEM == getPropGroup(prop);
}
-inline std::unique_ptr<VehiclePropValue> createVehiclePropValue(
- VehiclePropertyType type, size_t vecSize) {
- auto val = std::unique_ptr<VehiclePropValue>(new VehiclePropValue);
- switch (type) {
- case VehiclePropertyType::INT32: // fall through
- case VehiclePropertyType::INT32_VEC: // fall through
- case VehiclePropertyType::BOOLEAN:
- val->value.int32Values.resize(vecSize);
- break;
- case VehiclePropertyType::FLOAT:
- case VehiclePropertyType::FLOAT_VEC: // fall through
- val->value.floatValues.resize(vecSize);
- break;
- case VehiclePropertyType::INT64:
- val->value.int64Values.resize(vecSize);
- break;
- case VehiclePropertyType::BYTES:
- val->value.bytes.resize(vecSize);
- break;
- case VehiclePropertyType::STRING:
- break; // Valid, but nothing to do.
- default:
- ALOGE("createVehiclePropValue: unknown type: %d", type);
- val.reset(nullptr);
- }
- return val;
-}
+std::unique_ptr<VehiclePropValue> createVehiclePropValue(
+ VehiclePropertyType type, size_t vecSize);
-inline size_t getVehicleRawValueVectorSize(
- const VehiclePropValue::RawValue& value, VehiclePropertyType type) {
- switch (type) {
- case VehiclePropertyType::INT32: // fall through
- case VehiclePropertyType::INT32_VEC: // fall through
- case VehiclePropertyType::BOOLEAN:
- return value.int32Values.size();
- case VehiclePropertyType::FLOAT: // fall through
- case VehiclePropertyType::FLOAT_VEC:
- return value.floatValues.size();
- case VehiclePropertyType::INT64:
- return value.int64Values.size();
- case VehiclePropertyType::BYTES:
- return value.bytes.size();
- default:
- return 0;
- }
-}
+size_t getVehicleRawValueVectorSize(
+ const VehiclePropValue::RawValue& value, VehiclePropertyType type);
-/** Copies vector src to dest, dest should have enough space. */
-template <typename T>
-inline void copyHidlVec(hidl_vec<T>* dest, const hidl_vec<T>& src) {
- for (size_t i = 0; i < std::min(dest->size(), src.size()); i++) {
- (*dest)[i] = src[i];
- }
-}
+void copyVehicleRawValue(VehiclePropValue::RawValue* dest,
+ const VehiclePropValue::RawValue& src);
-inline void copyVehicleRawValue(VehiclePropValue::RawValue* dest,
- const VehiclePropValue::RawValue& src) {
- copyHidlVec(&dest->int32Values, src.int32Values);
- copyHidlVec(&dest->floatValues, src.floatValues);
- copyHidlVec(&dest->int64Values, src.int64Values);
- copyHidlVec(&dest->bytes, src.bytes);
- dest->stringValue = src.stringValue;
-}
+template<typename T>
+void shallowCopyHidlVec(hidl_vec<T>* dest, const hidl_vec<T>& src);
-template <typename T>
-inline void shallowCopyHidlVec(hidl_vec<T>* dest, const hidl_vec<T>& src) {
- if (src.size() > 0) {
- dest->setToExternal(const_cast<T*>(&src[0]), src.size());
- } else if (dest->size() > 0) {
- dest->resize(0);
- }
-}
+void shallowCopyHidlStr(hidl_string* dest, const hidl_string& src);
-inline void shallowCopyHidlStr(hidl_string* dest, const hidl_string& src ) {
- if (!src.empty()) {
- dest->setToExternal(src.c_str(), src.size());
- } else if (dest->size() > 0) {
- dest->setToExternal(0, 0);
- }
-}
-
-inline void shallowCopy(VehiclePropValue* dest,
- const VehiclePropValue& src) {
- dest->prop = src.prop;
- dest->areaId = src.areaId;
- dest->timestamp = src.timestamp;
- shallowCopyHidlVec(&dest->value.int32Values, src.value.int32Values);
- shallowCopyHidlVec(&dest->value.int64Values, src.value.int64Values);
- shallowCopyHidlVec(&dest->value.floatValues, src.value.floatValues);
- shallowCopyHidlVec(&dest->value.bytes, src.value.bytes);
- shallowCopyHidlStr(&dest->value.stringValue, src.value.stringValue);
-}
+void shallowCopy(VehiclePropValue* dest, const VehiclePropValue& src);
} // namespace V2_0
} // namespace vehicle