diff options
-rw-r--r-- | location/LocationAPI.cpp | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/location/LocationAPI.cpp b/location/LocationAPI.cpp index 001327c..ffe2d6f 100644 --- a/location/LocationAPI.cpp +++ b/location/LocationAPI.cpp @@ -39,7 +39,8 @@ typedef const GnssInterface* (getGnssInterface)(); typedef const FlpInterface* (getFlpInterface)(); typedef const GeofenceInterface* (getGeofenceInterface)(); - +typedef void (createOSFramework)(); +typedef void (destroyOSFramework)(); typedef struct { // bit mask of the adpaters that we need to wait for the removeClientCompleteCallback @@ -69,6 +70,7 @@ static pthread_mutex_t gDataMutex = PTHREAD_MUTEX_INITIALIZER; static bool gGnssLoadFailed = false; static bool gFlpLoadFailed = false; static bool gGeofenceLoadFailed = false; +static uint32_t gOSFrameworkRefCount = 0; template <typename T1, typename T2> static const T1* loadLocationInterface(const char* library, const char* name) { @@ -81,6 +83,28 @@ static const T1* loadLocationInterface(const char* library, const char* name) { } } +static void createOSFrameworkInstance() { + void* libHandle = nullptr; + createOSFramework* getter = (createOSFramework*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "createOSFramework"); + if (getter != nullptr) { + (*getter)(); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + +static void destroyOSFrameworkInstance() { + void* libHandle = nullptr; + destroyOSFramework* getter = (destroyOSFramework*)dlGetSymFromLib(libHandle, + "liblocationservice_glue.so", "destroyOSFramework"); + if (getter != nullptr) { + (*getter)(); + } else { + LOC_LOGe("dlGetSymFromLib failed for liblocationservice_glue.so"); + } +} + static bool needsGnssTrackingInfo(LocationCallbacks& locationCallbacks) { return (locationCallbacks.gnssLocationInfoCb != nullptr || @@ -171,6 +195,11 @@ LocationAPI::createInstance(LocationCallbacks& locationCallbacks) pthread_mutex_lock(&gDataMutex); + gOSFrameworkRefCount++; + if (1 == gOSFrameworkRefCount) { + createOSFrameworkInstance(); + } + if (isGnssClient(locationCallbacks)) { if (NULL == gData.gnssInterface && !gGnssLoadFailed) { gData.gnssInterface = @@ -295,6 +324,11 @@ LocationAPI::destroy(locationApiDestroyCompleteCallback destroyCompleteCb) __func__, __LINE__, this); } + if (1 == gOSFrameworkRefCount) { + destroyOSFrameworkInstance(); + } + gOSFrameworkRefCount--; + pthread_mutex_unlock(&gDataMutex); if (invokeDestroyCb == true) { (destroyCompleteCb) (); |