ContextHubService: Simplify hubId logic, ensure type correctness
Update nativeSendMessage() to simplify the logic for mapping the hub handle to hub ID, and also update the types of some variables to ensure their correctness. Also, rewrite unnecessary alias declarations as simpler using declarations. Test: run hello world context hub GTS test Change-Id: I8f9154a0ff2c81eff9eb509e9b0936e34569ec55
This commit is contained in:
@@ -14,7 +14,6 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
#undef LOG_NDEBUG
|
||||
#undef LOG_TAG
|
||||
#define LOG_NDEBUG 0
|
||||
@@ -39,20 +38,19 @@
|
||||
#include "core_jni_helpers.h"
|
||||
#include "JNIHelp.h"
|
||||
|
||||
using IContexthub = android::hardware::contexthub::V1_0::IContexthub;
|
||||
using android::hardware::contexthub::V1_0::AsyncEventType;
|
||||
using android::hardware::contexthub::V1_0::ContextHub;
|
||||
using android::hardware::contexthub::V1_0::ContextHubMsg;
|
||||
using android::hardware::contexthub::V1_0::HubAppInfo;
|
||||
using android::hardware::contexthub::V1_0::IContexthub;
|
||||
using android::hardware::contexthub::V1_0::IContexthubCallback;
|
||||
using android::hardware::contexthub::V1_0::Result;
|
||||
using android::hardware::contexthub::V1_0::TransactionResult;
|
||||
|
||||
using Result = android::hardware::contexthub::V1_0::Result;
|
||||
using ContextHubMsg = android::hardware::contexthub::V1_0::ContextHubMsg;
|
||||
using IContexthubCallback = android::hardware::contexthub::V1_0::IContexthubCallback;
|
||||
using AsyncEventType = android::hardware::contexthub::V1_0::AsyncEventType;
|
||||
using TransactionResult = android::hardware::contexthub::V1_0::TransactionResult;
|
||||
using ContextHub = android::hardware::contexthub::V1_0::ContextHub;
|
||||
using HubAppInfo = android::hardware::contexthub::V1_0::HubAppInfo;
|
||||
|
||||
template<typename T>
|
||||
using Return = android::hardware::Return<T>;
|
||||
using android::hardware::Return;
|
||||
|
||||
using std::chrono::steady_clock;
|
||||
|
||||
// If a transaction takes longer than this, we'll allow it to be
|
||||
// canceled by a new transaction. Note we do _not_ automatically
|
||||
// cancel a transaction after this much time. We can have a
|
||||
@@ -361,11 +359,12 @@ struct ContextHubServiceDb {
|
||||
|
||||
ContextHubServiceDb db;
|
||||
|
||||
int getHubIdForHubHandle(int hubHandle) {
|
||||
if (hubHandle < 0 || hubHandle >= db.hubInfo.numHubs) {
|
||||
return -1;
|
||||
bool getHubIdForHubHandle(int hubHandle, uint32_t *hubId) {
|
||||
if (hubHandle < 0 || hubHandle >= db.hubInfo.numHubs || hubId == nullptr) {
|
||||
return false;
|
||||
} else {
|
||||
return db.hubInfo.hubs[hubHandle].hubId;
|
||||
*hubId = db.hubInfo.hubs[hubHandle].hubId;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -380,17 +379,6 @@ int getHubHandleForAppInstance(jint id) {
|
||||
return db.appInstances[id].hubHandle;
|
||||
}
|
||||
|
||||
int getHubIdForAppInstance(jint id) {
|
||||
int hubHandle = getHubHandleForAppInstance(id);
|
||||
|
||||
if (hubHandle < 0) {
|
||||
ALOGD("Cannot find hub instance for app instance %d", id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return db.hubInfo.hubs[hubHandle].hubId;
|
||||
}
|
||||
|
||||
jint getAppInstanceForAppId(uint64_t app_id) {
|
||||
auto end = db.appInstances.end();
|
||||
for (auto current = db.appInstances.begin(); current != end; ++current) {
|
||||
@@ -1012,19 +1000,18 @@ jint nativeSendMessage(JNIEnv *env,
|
||||
jint retVal = -1; // Default to failure
|
||||
|
||||
jint *header = env->GetIntArrayElements(header_, 0);
|
||||
unsigned int numHeaderElements = env->GetArrayLength(header_);
|
||||
size_t numHeaderElements = env->GetArrayLength(header_);
|
||||
jbyte *data = env->GetByteArrayElements(data_, 0);
|
||||
int dataBufferLength = env->GetArrayLength(data_);
|
||||
size_t dataBufferLength = env->GetArrayLength(data_);
|
||||
|
||||
if (numHeaderElements < MSG_HEADER_SIZE) {
|
||||
ALOGW("Malformed header len");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint32_t appInstanceHandle = header[HEADER_FIELD_APP_INSTANCE];
|
||||
jint appInstanceHandle = header[HEADER_FIELD_APP_INSTANCE];
|
||||
uint32_t msgType = header[HEADER_FIELD_MSG_TYPE];
|
||||
int hubHandle = -1;
|
||||
int hubId;
|
||||
uint64_t appId;
|
||||
|
||||
if (msgType == CONTEXT_HUB_UNLOAD_APP) {
|
||||
@@ -1042,7 +1029,8 @@ jint nativeSendMessage(JNIEnv *env,
|
||||
hubHandle = header[HEADER_FIELD_HUB_HANDLE];
|
||||
}
|
||||
|
||||
if (hubHandle < 0) {
|
||||
uint32_t hubId = -1;
|
||||
if (!getHubIdForHubHandle(hubHandle, &hubId)) {
|
||||
ALOGD("Invalid hub Handle %d", hubHandle);
|
||||
return -1;
|
||||
}
|
||||
@@ -1072,18 +1060,16 @@ jint nativeSendMessage(JNIEnv *env,
|
||||
Result result;
|
||||
|
||||
if (msgType == CONTEXT_HUB_UNLOAD_APP) {
|
||||
hubId = getHubIdForHubHandle(hubHandle);
|
||||
ALOGW("Calling UnLoad NanoApp for app %" PRIx64 " on hub %d",
|
||||
ALOGW("Calling UnLoad NanoApp for app %" PRIx64 " on hub %" PRIu32,
|
||||
db.appInstances[appInstanceHandle].appInfo.appId,
|
||||
hubId);
|
||||
result = db.hubInfo.contextHub->unloadNanoApp(
|
||||
hubId, db.appInstances[appInstanceHandle].appInfo.appId, CONTEXT_HUB_UNLOAD_APP);
|
||||
} else {
|
||||
if (header[HEADER_FIELD_APP_INSTANCE] == OS_APP_ID) {
|
||||
if (appInstanceHandle == OS_APP_ID) {
|
||||
if (msgType == CONTEXT_HUB_LOAD_APP) {
|
||||
std::vector<uint8_t> dataVector(reinterpret_cast<uint8_t *>(data),
|
||||
reinterpret_cast<uint8_t *>(data + dataBufferLength));
|
||||
hubId = getHubIdForHubHandle(hubHandle);
|
||||
ALOGW("Calling Load NanoApp on hub %d", hubId);
|
||||
result = db.hubInfo.contextHub->loadNanoApp(hubId,
|
||||
dataVector,
|
||||
@@ -1093,25 +1079,27 @@ jint nativeSendMessage(JNIEnv *env,
|
||||
result = Result::BAD_PARAMS;
|
||||
}
|
||||
} else {
|
||||
|
||||
appId = getAppIdForAppInstance(header[HEADER_FIELD_APP_INSTANCE]);
|
||||
hubId = getHubIdForAppInstance(header[HEADER_FIELD_APP_INSTANCE]);
|
||||
|
||||
if (appId != static_cast<uint64_t>(INVALID_APP_ID) && hubId >= 0) {
|
||||
appId = getAppIdForAppInstance(appInstanceHandle);
|
||||
if (appId == static_cast<uint64_t>(INVALID_APP_ID)) {
|
||||
ALOGD("Cannot find application instance %d", appInstanceHandle);
|
||||
result = Result::BAD_PARAMS;
|
||||
} else if (hubHandle != getHubHandleForAppInstance(appInstanceHandle)) {
|
||||
ALOGE("Given hubHandle (%d) doesn't match expected for app instance (%d)",
|
||||
hubHandle,
|
||||
getHubHandleForAppInstance(appInstanceHandle));
|
||||
result = Result::BAD_PARAMS;
|
||||
} else {
|
||||
ContextHubMsg msg;
|
||||
msg.appName = appId;
|
||||
msg.msgType = msgType;
|
||||
msg.msg.setToExternal((unsigned char *)data, dataBufferLength);
|
||||
|
||||
ALOGW("Sending msg of type %" PRIu32 " len %u to app %" PRIx64 " on hub %d",
|
||||
ALOGW("Sending msg of type %" PRIu32 " len %zu to app %" PRIx64 " on hub %" PRIu32,
|
||||
msgType,
|
||||
dataBufferLength,
|
||||
appId,
|
||||
hubId);
|
||||
result = db.hubInfo.contextHub->sendMessageToHub(hubId, msg);
|
||||
} else {
|
||||
ALOGD("Cannot find application instance %u", header[HEADER_FIELD_APP_INSTANCE]);
|
||||
result = Result::BAD_PARAMS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user