summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDante Russo <drusso@codeaurora.org>2020-11-05 12:10:54 -0800
committerWei (GPS SD) Chen <weic@codeaurora.org>2020-12-14 10:06:40 -0800
commit79cbbb3d2d17f89d98ab8ca1b95648dd32a128b3 (patch)
treef4192a3d5f16eed37d3a32bfb36bbc48d1c3dab8
parent3c25bbbb134079d2e1f6e1182d266812787f9ba7 (diff)
Load OS Framework in Location API
Loading the OS Framework will allow for WiFi AP information to be injected Change-Id: Ie3227c0c5d75b6868b4db837dac47fef9d793b46 CRs-fixed: 2817934
-rw-r--r--location/LocationAPI.cpp36
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) ();