[Bugfix][T108][bug-view-]Fix the issue of multi-threaded resource usage

Only Configure: No
Affected branch: GSW_V1453
Affected module: pm
Is it affected on IC: only ASR
Self-test: yes
Doc Update: no

Change-Id: Ia958d9a9f66ed4d4d863a54c16f88868f3713e8d
diff --git a/mbtk/libgsw_lib/gsw_pm_interface.c b/mbtk/libgsw_lib/gsw_pm_interface.c
index ee28780..1cf9d48 100755
--- a/mbtk/libgsw_lib/gsw_pm_interface.c
+++ b/mbtk/libgsw_lib/gsw_pm_interface.c
@@ -40,7 +40,7 @@
 int (*mbtk_lpm_init)(mbtk_lpm_handler_t );

 

 int lock_fd = -1;

-

+pthread_mutex_t pm_lock;

 typedef struct

 {

     int fd;

@@ -156,6 +156,11 @@
     printf("wait_sdk_ready ret:%d\n",ret);  //due to the LOG* can not use

     if (handle())

         return GSW_HAL_NORMAL_FAIL;

+    if (pthread_mutex_init(&pm_lock, NULL) != 0)

+    {

+        LOGE(GSW_PM,"pthread_mutex_init pm_lock failed\n");

+        return GSW_HAL_NORMAL_FAIL;

+    }

     mbtk_lpm_init=(int(*)(mbtk_lpm_handler_t))dlsym(dlHandle_sleep, "mbtk_lpm_init");

     ret = mbtk_lpm_init((mbtk_lpm_handler_t)wakeup_callback);

     if(ret < 0)

@@ -179,6 +184,7 @@
         return GSW_HAL_NORMAL_FAIL;

     if (gsw_wakelock_name == NULL)

         return GSW_HAL_NORMAL_FAIL;

+    pthread_mutex_lock(&pm_lock);

     for(i=0 ;i<LOCK_MAX_SIZE;i++)

     {

         if(lock_name[i].name != NULL && strcmp(lock_name[i].name, gsw_wakelock_name) == 0)

@@ -190,7 +196,8 @@
     if (i >= LOCK_MAX_SIZE)

     {

         LOGE(GSW_PM,"mbtk_wakelock_lock not create.\n");

-        return GSW_HAL_NORMAL_FAIL;

+        ret = GSW_HAL_NORMAL_FAIL;

+        goto enter_sleep_end;

     }

 

     mbtk_wakelock_unlock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_unlock");

@@ -198,15 +205,16 @@
     if(ret < 0)

     {

         LOGE(GSW_PM,"mbtk_wakelock_unlock FAIL.\n");

-        return GSW_HAL_NORMAL_FAIL;

+        ret = GSW_HAL_NORMAL_FAIL;

+        goto enter_sleep_end;

     }

-

     mbtk_wakelock_destroy=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_destroy");

     ret = mbtk_wakelock_destroy(lock_fd);

     if(ret < 0)

     {

         LOGE(GSW_PM,"mbtk_wakelock_destroy FAIL.\n");

-        return GSW_HAL_NORMAL_FAIL;

+        ret = GSW_HAL_NORMAL_FAIL;

+        goto enter_sleep_end;

     }

     if (lock_name[i].name != NULL)

     {

@@ -214,7 +222,10 @@
         lock_name[i].name = NULL;

         lock_name[i].fd = -1;

     }

-    return GSW_HAL_SUCCESS;

+    ret = GSW_HAL_SUCCESS;

+enter_sleep_end:

+    pthread_mutex_unlock(&pm_lock);

+    return ret;

 }

 

 /**

@@ -230,13 +241,14 @@
         return GSW_HAL_NORMAL_FAIL;

     if (gsw_wakelock_name == NULL)

         return GSW_HAL_NORMAL_FAIL;

+    pthread_mutex_lock(&pm_lock);

     mbtk_wakelock_create=(int(*)(const char* name , size_t))dlsym(dlHandle_sleep, "mbtk_wakelock_create");

     lock_fd = mbtk_wakelock_create(gsw_wakelock_name, strlen(gsw_wakelock_name));

     if(lock_fd < 0)

     {

         LOGE(GSW_PM,"mbtk_wakelock_create FAIL.\n");

         ret = GSW_HAL_NORMAL_FAIL;

-        goto end;

+        goto exit_sleep_end;

     }

     mbtk_wakelock_lock=(int(*)(int))dlsym(dlHandle_sleep, "mbtk_wakelock_lock");

 

@@ -245,7 +257,7 @@
     {

         LOGE(GSW_PM,"mbtk_wakelock_lock FAIL.\n");

         ret = GSW_HAL_NORMAL_FAIL;

-        goto end;

+        goto exit_sleep_end;

     }

     for(i=0 ;i<LOCK_MAX_SIZE;i++)

     {

@@ -256,19 +268,20 @@
     {

         LOGE(GSW_PM,"mbtk_wakelock_lock not space FAIL.\n");

         ret = GSW_HAL_NORMAL_FAIL;

-        goto end;

+        goto exit_sleep_end;

     }

     lock_name[i].name = malloc(strlen(gsw_wakelock_name)+1);

     if (lock_name[i].name == NULL)

     {

         LOGE(GSW_PM,"mbtk_wakelock_lock remeber FAIL.\n");

         ret = GSW_HAL_NORMAL_FAIL;

-        goto end;

+        goto exit_sleep_end;

     }

     memcpy(lock_name[i].name, gsw_wakelock_name, strlen(gsw_wakelock_name)+1);

     lock_name[i].fd = lock_fd;

     ret = GSW_HAL_SUCCESS;

-end:

+exit_sleep_end:

+    pthread_mutex_unlock(&pm_lock);

     return ret;

 }