Fixed exception at shutdown if the controllers are closed after the HIDDeviceManager is shutdown

This commit is contained in:
Sam Lantinga 2020-03-13 13:05:32 -07:00
parent 80d075a01a
commit cb986aff9f

View File

@ -436,6 +436,12 @@ public:
g_JVM->AttachCurrentThread( &env, NULL ); g_JVM->AttachCurrentThread( &env, NULL );
pthread_setspecific( g_ThreadKey, (void*)env ); pthread_setspecific( g_ThreadKey, (void*)env );
if ( !g_HIDDeviceManagerCallbackHandler )
{
LOGV( "Device open without callback handler" );
return false;
}
m_bIsWaitingForOpen = false; m_bIsWaitingForOpen = false;
m_bOpenResult = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerOpen, m_nId ); m_bOpenResult = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerOpen, m_nId );
ExceptionCheck( env, "BOpen" ); ExceptionCheck( env, "BOpen" );
@ -545,11 +551,18 @@ public:
g_JVM->AttachCurrentThread( &env, NULL ); g_JVM->AttachCurrentThread( &env, NULL );
pthread_setspecific( g_ThreadKey, (void*)env ); pthread_setspecific( g_ThreadKey, (void*)env );
jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); int nRet = -1;
int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf ); if ( g_HIDDeviceManagerCallbackHandler )
ExceptionCheck( env, "SendOutputReport" ); {
jbyteArray pBuf = NewByteArray( env, pData, nDataLen );
env->DeleteLocalRef( pBuf ); nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf );
ExceptionCheck( env, "SendOutputReport" );
env->DeleteLocalRef( pBuf );
}
else
{
LOGV( "SendOutputReport without callback handler" );
}
return nRet; return nRet;
} }
@ -560,10 +573,18 @@ public:
g_JVM->AttachCurrentThread( &env, NULL ); g_JVM->AttachCurrentThread( &env, NULL );
pthread_setspecific( g_ThreadKey, (void*)env ); pthread_setspecific( g_ThreadKey, (void*)env );
jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); int nRet = -1;
int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf ); if ( g_HIDDeviceManagerCallbackHandler )
ExceptionCheck( env, "SendFeatureReport" ); {
env->DeleteLocalRef( pBuf ); jbyteArray pBuf = NewByteArray( env, pData, nDataLen );
nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf );
ExceptionCheck( env, "SendFeatureReport" );
env->DeleteLocalRef( pBuf );
}
else
{
LOGV( "SendFeatureReport without callback handler" );
}
return nRet; return nRet;
} }
@ -587,6 +608,12 @@ public:
g_JVM->AttachCurrentThread( &env, NULL ); g_JVM->AttachCurrentThread( &env, NULL );
pthread_setspecific( g_ThreadKey, (void*)env ); pthread_setspecific( g_ThreadKey, (void*)env );
if ( !g_HIDDeviceManagerCallbackHandler )
{
LOGV( "GetFeatureReport without callback handler" );
return -1;
}
{ {
hid_mutex_guard cvl( &m_cvLock ); hid_mutex_guard cvl( &m_cvLock );
if ( m_bIsWaitingForFeatureReport ) if ( m_bIsWaitingForFeatureReport )
@ -657,8 +684,11 @@ public:
g_JVM->AttachCurrentThread( &env, NULL ); g_JVM->AttachCurrentThread( &env, NULL );
pthread_setspecific( g_ThreadKey, (void*)env ); pthread_setspecific( g_ThreadKey, (void*)env );
env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId ); if ( g_HIDDeviceManagerCallbackHandler )
ExceptionCheck( env, "Close" ); {
env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId );
ExceptionCheck( env, "Close" );
}
hid_mutex_guard dataLock( &m_dataLock ); hid_mutex_guard dataLock( &m_dataLock );
m_vecData.clear(); m_vecData.clear();