Use atomic reference counting for the HID device object

This commit is contained in:
Sam Lantinga 2018-09-14 18:31:01 -07:00
parent 6a7b0c27af
commit e8a0e35e24
3 changed files with 23 additions and 4 deletions

0
Xcode-iOS/SDL/SDL.xcodeproj/project.pbxproj Normal file → Executable file
View File

0
Xcode/SDL/SDL.xcodeproj/project.pbxproj Normal file → Executable file
View File

View File

@ -9,6 +9,7 @@
#include <jni.h> #include <jni.h>
#include <android/log.h> #include <android/log.h>
#include <pthread.h> #include <pthread.h>
#include <stdlib.h>
#include <errno.h> // For ETIMEDOUT and ECONNRESET #include <errno.h> // For ETIMEDOUT and ECONNRESET
#include <stdlib.h> // For malloc() and free() #include <stdlib.h> // For malloc() and free()
@ -27,6 +28,7 @@
#define HID_DEVICE_MANAGER_JAVA_INTERFACE(function) CONCAT1(SDL_JAVA_PREFIX, HIDDeviceManager, function) #define HID_DEVICE_MANAGER_JAVA_INTERFACE(function) CONCAT1(SDL_JAVA_PREFIX, HIDDeviceManager, function)
#include "../hidapi/hidapi.h" #include "../hidapi/hidapi.h"
typedef uint32_t uint32; typedef uint32_t uint32;
typedef uint64_t uint64; typedef uint64_t uint64;
@ -364,12 +366,20 @@ public:
int IncrementRefCount() int IncrementRefCount()
{ {
return ++m_nRefCount; int nValue;
pthread_mutex_lock( &m_refCountLock );
nValue = ++m_nRefCount;
pthread_mutex_unlock( &m_refCountLock );
return nValue;
} }
int DecrementRefCount() int DecrementRefCount()
{ {
return --m_nRefCount; int nValue;
pthread_mutex_lock( &m_refCountLock );
nValue = --m_nRefCount;
pthread_mutex_unlock( &m_refCountLock );
return nValue;
} }
int GetId() int GetId()
@ -394,12 +404,20 @@ public:
int IncrementDeviceRefCount() int IncrementDeviceRefCount()
{ {
return ++m_nDeviceRefCount; int nValue;
pthread_mutex_lock( &m_refCountLock );
nValue = ++m_nDeviceRefCount;
pthread_mutex_unlock( &m_refCountLock );
return nValue;
} }
int DecrementDeviceRefCount() int DecrementDeviceRefCount()
{ {
return --m_nDeviceRefCount; int nValue;
pthread_mutex_lock( &m_refCountLock );
nValue = --m_nDeviceRefCount;
pthread_mutex_unlock( &m_refCountLock );
return nValue;
} }
bool BOpen() bool BOpen()
@ -644,6 +662,7 @@ public:
} }
private: private:
pthread_mutex_t m_refCountLock = PTHREAD_MUTEX_INITIALIZER;
int m_nRefCount = 0; int m_nRefCount = 0;
int m_nId = 0; int m_nId = 0;
hid_device_info *m_pInfo = nullptr; hid_device_info *m_pInfo = nullptr;