[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;
}