Skip to content

Commit

Permalink
Use platform lock for Android (#10203)
Browse files Browse the repository at this point in the history
  • Loading branch information
austinh0 authored Oct 6, 2021
1 parent 962faf8 commit 8788f6f
Show file tree
Hide file tree
Showing 12 changed files with 865 additions and 886 deletions.
1 change: 0 additions & 1 deletion src/android/CHIPTest/app/src/main/cpp/CHIPTest-JNI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <support/CHIPJNIError.h>
#include <support/CodeUtils.h>
#include <support/JniReferences.h>
#include <support/StackLock.h>
#include <support/UnitTestRegistration.h>

#include <nlunit-test.h>
Expand Down
14 changes: 6 additions & 8 deletions src/controller/java/AndroidDeviceControllerWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
#include "AndroidDeviceControllerWrapper.h"
#include <lib/support/CHIPJNIError.h>
#include <lib/support/StackLock.h>

#include <algorithm>
#include <memory>
Expand Down Expand Up @@ -169,8 +168,7 @@ CHIP_ERROR AndroidDeviceControllerWrapper::GenerateNOCChain(const ByteSpan & csr
}

AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew(JavaVM * vm, jobject deviceControllerObj,
pthread_mutex_t * stackLock, chip::NodeId nodeId,
chip::System::Layer * systemLayer,
chip::NodeId nodeId, chip::System::Layer * systemLayer,
chip::Inet::InetLayer * inetLayer,
CHIP_ERROR * errInfoOnFailure)
{
Expand Down Expand Up @@ -201,7 +199,7 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew(Jav
*errInfoOnFailure = CHIP_ERROR_NO_MEMORY;
return nullptr;
}
std::unique_ptr<AndroidDeviceControllerWrapper> wrapper(new AndroidDeviceControllerWrapper(std::move(controller), stackLock));
std::unique_ptr<AndroidDeviceControllerWrapper> wrapper(new AndroidDeviceControllerWrapper(std::move(controller)));

wrapper->SetJavaObjectRef(vm, deviceControllerObj);

Expand Down Expand Up @@ -274,25 +272,25 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew(Jav

void AndroidDeviceControllerWrapper::OnStatusUpdate(chip::Controller::DevicePairingDelegate::Status status)
{
StackUnlockGuard unlockGuard(mStackLock);
chip::DeviceLayer::StackUnlock unlock;
CallJavaMethod("onStatusUpdate", static_cast<jint>(status));
}

void AndroidDeviceControllerWrapper::OnPairingComplete(CHIP_ERROR error)
{
StackUnlockGuard unlockGuard(mStackLock);
chip::DeviceLayer::StackUnlock unlock;
CallJavaMethod("onPairingComplete", static_cast<jint>(error.AsInteger()));
}

void AndroidDeviceControllerWrapper::OnPairingDeleted(CHIP_ERROR error)
{
StackUnlockGuard unlockGuard(mStackLock);
chip::DeviceLayer::StackUnlock unlock;
CallJavaMethod("onPairingDeleted", static_cast<jint>(error.AsInteger()));
}

void AndroidDeviceControllerWrapper::OnCommissioningComplete(NodeId deviceId, CHIP_ERROR error)
{
StackUnlockGuard unlockGuard(mStackLock);
chip::DeviceLayer::StackUnlock unlock;
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
jmethodID onCommissioningCompleteMethod;
CHIP_ERROR err = JniReferences::GetInstance().FindMethod(env, mJavaObjectRef, "onCommissioningComplete", "(JI)V",
Expand Down
11 changes: 4 additions & 7 deletions src/controller/java/AndroidDeviceControllerWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,9 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel
return reinterpret_cast<AndroidDeviceControllerWrapper *>(handle);
}

static AndroidDeviceControllerWrapper * AllocateNew(JavaVM * vm, jobject deviceControllerObj, pthread_mutex_t * stackLock,
chip::NodeId nodeId, chip::System::Layer * systemLayer,
chip::Inet::InetLayer * inetLayer, CHIP_ERROR * errInfoOnFailure);
static AndroidDeviceControllerWrapper * AllocateNew(JavaVM * vm, jobject deviceControllerObj, chip::NodeId nodeId,
chip::System::Layer * systemLayer, chip::Inet::InetLayer * inetLayer,
CHIP_ERROR * errInfoOnFailure);

CHIP_ERROR GenerateNOCChainAfterValidation(chip::NodeId nodeId, chip::FabricId fabricId,
const chip::Crypto::P256PublicKey & ephemeralKey, chip::MutableByteSpan & rcac,
Expand All @@ -102,8 +102,6 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel
ChipDeviceControllerPtr mController;
chip::Controller::ExampleOperationalCredentialsIssuer mOpCredsIssuer;

pthread_mutex_t * mStackLock;

JavaVM * mJavaVM = nullptr;
jobject mJavaObjectRef = nullptr;

Expand All @@ -113,8 +111,7 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel
chip::FabricId mNextFabricId = 0;
bool mNodeIdRequested = false;

AndroidDeviceControllerWrapper(ChipDeviceControllerPtr controller, pthread_mutex_t * stackLock) :
mController(std::move(controller)), mStackLock(stackLock)
AndroidDeviceControllerWrapper(ChipDeviceControllerPtr controller) : mController(std::move(controller))
{
chip::CalendarToChipEpochTime(2021, 06, 10, 0, 0, 0, mNow);
}
Expand Down
41 changes: 20 additions & 21 deletions src/controller/java/CHIPDeviceController-JNI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#include <lib/support/CHIPJNIError.h>
#include <lib/support/JniReferences.h>
#include <lib/support/JniTypeWrappers.h>
#include <lib/support/StackLock.h>

#include <app/chip-zcl-zpro-codec.h>
#include <atomic>
Expand Down Expand Up @@ -113,7 +112,7 @@ jint JNI_OnLoad(JavaVM * jvm, void * reserved)
if (err != CHIP_NO_ERROR)
{
ThrowError(env, err);
StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
JNI_OnUnload(jvm, reserved);
}

Expand All @@ -122,15 +121,15 @@ jint JNI_OnLoad(JavaVM * jvm, void * reserved)

void JNI_OnUnload(JavaVM * jvm, void * reserved)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
ChipLogProgress(Controller, "JNI_OnUnload() called");

// If the IO thread has been started, shut it down and wait for it to exit.
if (sIOThread != PTHREAD_NULL)
{
chip::DeviceLayer::PlatformMgr().StopEventLoopTask();

StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
pthread_join(sIOThread, NULL);
}

Expand All @@ -141,7 +140,7 @@ void JNI_OnUnload(JavaVM * jvm, void * reserved)

JNI_METHOD(jlong, newDeviceController)(JNIEnv * env, jobject self)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
AndroidDeviceControllerWrapper * wrapper = NULL;
long result = 0;
Expand All @@ -152,8 +151,8 @@ JNI_METHOD(jlong, newDeviceController)(JNIEnv * env, jobject self)
err = DeviceLayer::PlatformMgr().InitChipStack();
SuccessOrExit(err);

wrapper = AndroidDeviceControllerWrapper::AllocateNew(sJVM, self, JniReferences::GetInstance().GetStackLock(), kLocalDeviceId,
&DeviceLayer::SystemLayer(), &DeviceLayer::InetLayer, &err);
wrapper = AndroidDeviceControllerWrapper::AllocateNew(sJVM, self, kLocalDeviceId, &DeviceLayer::SystemLayer(),
&DeviceLayer::InetLayer, &err);
SuccessOrExit(err);

// Create and start the IO thread. Must be called after Controller()->Init
Expand Down Expand Up @@ -185,7 +184,7 @@ JNI_METHOD(jlong, newDeviceController)(JNIEnv * env, jobject self)
JNI_METHOD(void, pairDevice)
(JNIEnv * env, jobject self, jlong handle, jlong deviceId, jint connObj, jlong pinCode, jbyteArray csrNonce)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

Expand Down Expand Up @@ -213,7 +212,7 @@ JNI_METHOD(void, pairDeviceWithAddress)
(JNIEnv * env, jobject self, jlong handle, jlong deviceId, jstring address, jint port, jint discriminator, jint pinCode,
jbyteArray csrNonce)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

Expand Down Expand Up @@ -244,7 +243,7 @@ JNI_METHOD(void, pairDeviceWithAddress)

JNI_METHOD(void, unpairDevice)(JNIEnv * env, jobject self, jlong handle, jlong deviceId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

Expand All @@ -261,7 +260,7 @@ JNI_METHOD(void, unpairDevice)(JNIEnv * env, jobject self, jlong handle, jlong d

JNI_METHOD(void, stopDevicePairing)(JNIEnv * env, jobject self, jlong handle, jlong deviceId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

Expand All @@ -278,7 +277,7 @@ JNI_METHOD(void, stopDevicePairing)(JNIEnv * env, jobject self, jlong handle, jl

JNI_METHOD(jlong, getDevicePointer)(JNIEnv * env, jobject self, jlong handle, jlong deviceId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
Device * chipDevice = nullptr;

ChipLogProgress(Controller, "getDevicePointer() called with device ID");
Expand All @@ -291,7 +290,7 @@ JNI_METHOD(jlong, getDevicePointer)(JNIEnv * env, jobject self, jlong handle, jl

JNI_METHOD(void, getConnectedDevicePointer)(JNIEnv * env, jobject self, jlong handle, jlong nodeId, jlong callbackHandle)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

GetConnectedDeviceCallback * connectedDeviceCallback = reinterpret_cast<GetConnectedDeviceCallback *>(callbackHandle);
Expand All @@ -301,7 +300,7 @@ JNI_METHOD(void, getConnectedDevicePointer)(JNIEnv * env, jobject self, jlong ha

JNI_METHOD(void, pairTestDeviceWithoutSecurity)(JNIEnv * env, jobject self, jlong handle, jstring deviceAddr)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);
chip::Inet::IPAddress deviceIPAddr;
Expand All @@ -325,7 +324,7 @@ JNI_METHOD(void, pairTestDeviceWithoutSecurity)(JNIEnv * env, jobject self, jlon

JNI_METHOD(void, disconnectDevice)(JNIEnv * env, jobject self, jlong handle, jlong deviceId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);
CHIP_ERROR err = CHIP_NO_ERROR;
Device * chipDevice = nullptr;
Expand All @@ -345,7 +344,7 @@ JNI_METHOD(void, disconnectDevice)(JNIEnv * env, jobject self, jlong handle, jlo

JNI_METHOD(jboolean, isActive)(JNIEnv * env, jobject self, jlong handle)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;

Device * chipDevice = reinterpret_cast<Device *>(handle);
return chipDevice->IsActive();
Expand All @@ -367,7 +366,7 @@ void GetCHIPDevice(JNIEnv * env, long wrapperHandle, uint64_t deviceId, Device *

JNI_METHOD(jstring, getIpAddress)(JNIEnv * env, jobject self, jlong handle, jlong deviceId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
Device * chipDevice = nullptr;

GetCHIPDevice(env, handle, deviceId, &chipDevice);
Expand All @@ -385,7 +384,7 @@ JNI_METHOD(jstring, getIpAddress)(JNIEnv * env, jobject self, jlong handle, jlon

JNI_METHOD(void, updateDevice)(JNIEnv * env, jobject self, jlong handle, jlong fabricId, jlong deviceId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;

AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

Expand All @@ -399,7 +398,7 @@ JNI_METHOD(void, updateDevice)(JNIEnv * env, jobject self, jlong handle, jlong f

JNI_METHOD(jboolean, openPairingWindow)(JNIEnv * env, jobject self, jlong handle, jlong deviceId, jint duration)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
Device * chipDevice = nullptr;
chip::SetupPayload setupPayload;
Expand All @@ -421,7 +420,7 @@ JNI_METHOD(jboolean, openPairingWindow)(JNIEnv * env, jobject self, jlong handle
JNI_METHOD(jboolean, openPairingWindowWithPIN)
(JNIEnv * env, jobject self, jlong handle, jlong deviceId, jint duration, jint iteration, jint discriminator, jlong setupPinCode)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
Device * chipDevice = nullptr;
chip::SetupPayload setupPayload;
Expand All @@ -444,7 +443,7 @@ JNI_METHOD(jboolean, openPairingWindowWithPIN)

JNI_METHOD(void, deleteDeviceController)(JNIEnv * env, jobject self, jlong handle)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle);

ChipLogProgress(Controller, "deleteDeviceController() called");
Expand Down
22 changes: 11 additions & 11 deletions src/controller/java/templates/CHIPClusters-JNI.zapt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
#include <lib/support/CHIPJNIError.h>
#include <lib/support/JniReferences.h>
#include <lib/support/JniTypeWrappers.h>
#include <lib/support/StackLock.h>
#include <jni.h>
#include <lib/core/CHIPSafeCasts.h>
#include <lib/support/CodeUtils.h>
#include <lib/support/Span.h>
#include <platform/PlatformManager.h>

#define JNI_METHOD(RETURN, CLASS_NAME, METHOD_NAME) \
extern "C" JNIEXPORT RETURN JNICALL Java_chip_devicecontroller_ChipClusters_00024##CLASS_NAME##_##METHOD_NAME
Expand Down Expand Up @@ -111,7 +111,7 @@ class CHIPDefaultSuccessCallback : public Callback::Callback<DefaultSuccessCallb

static void CallbackFn(void * context)
{
StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
CHIP_ERROR err = CHIP_NO_ERROR;
jmethodID javaMethod;
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
Expand Down Expand Up @@ -174,7 +174,7 @@ class CHIPDefaultFailureCallback : public Callback::Callback<DefaultFailureCallb

static void CallbackFn(void * context, uint8_t status)
{
StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
CHIP_ERROR err = CHIP_NO_ERROR;
jmethodID javaMethod;
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
Expand Down Expand Up @@ -240,7 +240,7 @@ class CHIP{{chipCallback.name}}AttributeCallback : public Callback::Callback<{{c

static void CallbackFn(void * context, {{chipCallback.type}} value)
{
StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
CHIP_ERROR err = CHIP_NO_ERROR;

JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
Expand Down Expand Up @@ -317,7 +317,7 @@ class CHIP{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Callba

static void CallbackFn(void * context{{#chip_cluster_response_arguments}}, {{asUnderlyingZclType type}} {{asSymbol label}}{{/chip_cluster_response_arguments}})
{
StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
CHIP_ERROR err = CHIP_NO_ERROR;
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
jobject javaCallbackRef;
Expand Down Expand Up @@ -413,7 +413,7 @@ class CHIP{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}AttributeCall

static void CallbackFn(void * context, uint16_t count, {{chipType}} * entries)
{
StackUnlockGuard unlockGuard(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackUnlock unlock;
CHIP_ERROR err = CHIP_NO_ERROR;
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
jobject javaCallbackRef;
Expand Down Expand Up @@ -502,7 +502,7 @@ class CHIP{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}AttributeCall

JNI_METHOD(void, BaseChipCluster, deleteCluster)(JNIEnv * env, jobject self, jlong clusterPtr)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
ClusterBase * cluster = reinterpret_cast<ClusterBase *>(clusterPtr);
if (cluster != nullptr) {
delete cluster;
Expand All @@ -512,7 +512,7 @@ JNI_METHOD(void, BaseChipCluster, deleteCluster)(JNIEnv * env, jobject self, jlo
{{#chip_client_clusters}}
JNI_METHOD(jlong, {{asUpperCamelCase name}}Cluster, initWithDevice)(JNIEnv * env, jobject self, jlong devicePtr, jint endpointId)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
{{asUpperCamelCase name}}Cluster * cppCluster = new {{asUpperCamelCase name}}Cluster();

cppCluster->Associate(reinterpret_cast<Device *>(devicePtr), endpointId);
Expand All @@ -526,7 +526,7 @@ JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, {{asLowerCamelCase name}})
JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, {{asLowerCamelCase name}})(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback)
{{/if}}
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIP_ERROR err = CHIP_NO_ERROR;
{{asUpperCamelCase ../name}}Cluster * cppCluster;

Expand Down Expand Up @@ -586,7 +586,7 @@ exit:

JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, read{{asUpperCamelCase name}}Attribute)(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
{{#if isList}}
CHIP{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}AttributeCallback * onSuccess = new CHIP{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}AttributeCallback(callback);
{{else}}
Expand Down Expand Up @@ -624,7 +624,7 @@ JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, read{{asUpperCamelCase nam

JNI_METHOD(void, {{asUpperCamelCase ../name}}Cluster, write{{asUpperCamelCase name}}Attribute)(JNIEnv * env, jobject self, jlong clusterPtr, jobject callback, {{asJniBasicType type}} value)
{
StackLockGuard lock(JniReferences::GetInstance().GetStackLock());
chip::DeviceLayer::StackLock lock;
CHIPDefaultSuccessCallback * onSuccess = new CHIPDefaultSuccessCallback(callback);
if (!onSuccess) {
ReturnIllegalStateException(env, callback, "Error creating native success callback", CHIP_ERROR_NO_MEMORY.AsInteger());
Expand Down
Loading

0 comments on commit 8788f6f

Please sign in to comment.