summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmarnath Hullur Subramanyam <amarnath@codeaurora.org>2015-08-26 20:27:59 -0700
committerThe Android Automerger <android-build@google.com>2015-08-28 07:40:27 -0700
commit16f09fc6f7f878932d2739b67de50ed795d29500 (patch)
treef9e0326df0c27dbd95637cf3fa13075a2d1ca3ac
parenta9fbd3df0c38ea1a93c39e462ddd29339d05e39c (diff)
downloadandroid_hardware_qcom_wlan-16f09fc6f7f878932d2739b67de50ed795d29500.tar.gz
android_hardware_qcom_wlan-16f09fc6f7f878932d2739b67de50ed795d29500.tar.bz2
android_hardware_qcom_wlan-16f09fc6f7f878932d2739b67de50ed795d29500.zip
WiFi-HAL: Unlock mutex before calling framework callback
As part of earlier commit log_handler and alert_handler were protected by mutex. However, calling framework callback within mutex context would cause deadlock, thus unlock mutex before calling the framework callback and reacquire again when required. Bug: 23530883 Change-Id: If4cd92be906307a9e5ff7a8002b219f93f1bda64
-rw-r--r--qcwcn/wifi_hal/rb_wrapper.cpp17
-rw-r--r--qcwcn/wifi_hal/wifilogger.cpp10
2 files changed, 15 insertions, 12 deletions
diff --git a/qcwcn/wifi_hal/rb_wrapper.cpp b/qcwcn/wifi_hal/rb_wrapper.cpp
index 4738628..932af06 100644
--- a/qcwcn/wifi_hal/rb_wrapper.cpp
+++ b/qcwcn/wifi_hal/rb_wrapper.cpp
@@ -104,13 +104,7 @@ void push_out_rb_data(void *cb_ctx)
struct rb_info *rb_info = (struct rb_info *)cb_ctx;
hal_info *info = (hal_info *)rb_info->ctx;
wifi_ring_buffer_status rbs;
-
- pthread_mutex_lock(&info->lh_lock);
- if (info->on_ring_buffer_data == NULL) {
- ALOGE("on_ring_buffer_data handle is not set yet");
- pthread_mutex_unlock(&info->lh_lock);
- return;
- }
+ wifi_ring_buffer_data_handler handler;
while (1) {
size_t length = 0;
@@ -121,10 +115,15 @@ void push_out_rb_data(void *cb_ctx)
break;
}
get_rb_status(rb_info, &rbs);
- info->on_ring_buffer_data(rb_info->name, (char *)buf, length, &rbs);
+ pthread_mutex_lock(&info->lh_lock);
+ handler.on_ring_buffer_data = info->on_ring_buffer_data;
+ pthread_mutex_unlock(&info->lh_lock);
+ if (handler.on_ring_buffer_data) {
+ handler.on_ring_buffer_data(rb_info->name, (char *)buf,
+ length, &rbs);
+ }
free(buf);
};
- pthread_mutex_unlock(&info->lh_lock);
gettimeofday(&rb_info->last_push_time, NULL);
}
diff --git a/qcwcn/wifi_hal/wifilogger.cpp b/qcwcn/wifi_hal/wifilogger.cpp
index 1baaed3..87b1412 100644
--- a/qcwcn/wifi_hal/wifilogger.cpp
+++ b/qcwcn/wifi_hal/wifilogger.cpp
@@ -199,11 +199,15 @@ void push_out_all_ring_buffers(hal_info *info)
void send_alert(hal_info *info, int reason_code)
{
+ wifi_alert_handler handler;
+
pthread_mutex_lock(&info->ah_lock);
- if (info->on_alert) {
- info->on_alert(0, NULL, 0, reason_code);
- }
+ handler.on_alert = info->on_alert;
pthread_mutex_unlock(&info->ah_lock);
+
+ if (handler.on_alert) {
+ handler.on_alert(0, NULL, 0, reason_code);
+ }
}
void WifiLoggerCommand::setFeatureSet(u32 *support) {