Merge "agm: linkToDeath only for new clients"
diff --git a/ipc/HwBinders/agm_ipc_service/inc/agm_server_wrapper.h b/ipc/HwBinders/agm_ipc_service/inc/agm_server_wrapper.h
index 3b1963f..afff0ee 100644
--- a/ipc/HwBinders/agm_ipc_service/inc/agm_server_wrapper.h
+++ b/ipc/HwBinders/agm_ipc_service/inc/agm_server_wrapper.h
@@ -255,7 +255,7 @@
     int is_agm_initialized() { return agm_initialized;}
 
 private:
-    sp<client_death_notifier> Client_death_notifier = NULL;
+    sp<client_death_notifier> mDeathNotifier = NULL;
     bool agm_initialized;
 };
 
diff --git a/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp b/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp
index 7f0a653..a407f72 100644
--- a/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp
+++ b/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp
@@ -36,11 +36,13 @@
 #include <hwbinder/IPCThreadState.h>
 
 #define MAX_CACHE_SIZE 64
+using AgmCallbackData = ::vendor::qti::hardware::AGMIPC::V1_0::implementation::clbk_data;
+using AgmServerCallback = ::vendor::qti::hardware::AGMIPC::V1_0::implementation::SrvrClbk;
 
 void client_death_notifier::serviceDied(uint64_t cookie,
                    const android::wp<::android::hidl::base::V1_0::IBase>& who __unused)
 {
-    ALOGI("Client died ,cookie (pid): %llu",(unsigned long long) cookie);
+    ALOGI("Client died (pid): %llu",(unsigned long long) cookie);
     struct listnode *node = NULL;
     struct listnode *tempnode = NULL;
     agm_client_session_handle *hndl = NULL;
@@ -48,28 +50,26 @@
     struct listnode *sess_node = NULL;
     struct listnode *sess_tempnode = NULL;
 
-    ::vendor::qti::hardware::AGMIPC::V1_0::implementation::clbk_data *clbk_data_hndl = NULL;
+    AgmCallbackData* clbk_data_hndl = NULL;
     if (clbk_data_list_init) {
-    pthread_mutex_lock(&clbk_data_list_lock);
-    list_for_each_safe(node, tempnode, &clbk_data_list) {
-        clbk_data_hndl = node_to_item(node,
-             ::vendor::qti::hardware::AGMIPC::V1_0::implementation::clbk_data, list);
-        if (clbk_data_hndl->srv_clt_data->pid == cookie) {
-            ALOGV("%s : Matched pid with cookie = \" %d \" ", __func__,
-                                               clbk_data_hndl->srv_clt_data->pid);
-            ::vendor::qti::hardware::AGMIPC::V1_0::implementation::SrvrClbk *tmp_sr_clbk_data =
-                                                                   clbk_data_hndl->srv_clt_data;
-            /*Unregister this callback from session_obj*/
-            agm_session_register_cb(tmp_sr_clbk_data->session_id,
-                                    NULL,
-                                    (enum event_type)tmp_sr_clbk_data->event,
-                                    tmp_sr_clbk_data),
-            list_remove(node);
-            free(clbk_data_hndl);
+        pthread_mutex_lock(&clbk_data_list_lock);
+        list_for_each_safe(node, tempnode, &clbk_data_list) {
+            clbk_data_hndl = node_to_item(node, AgmCallbackData, list);
+            if (clbk_data_hndl->srv_clt_data->pid == cookie) {
+                ALOGV("%s pid matched %d ", __func__, clbk_data_hndl->srv_clt_data->pid);
+                AgmServerCallback* tmp_sr_clbk_data = clbk_data_hndl->srv_clt_data;
+                /*Unregister this callback from session_obj*/
+                agm_session_register_cb(tmp_sr_clbk_data->session_id,
+                                        NULL,
+                                        (enum event_type)tmp_sr_clbk_data->event,
+                                        tmp_sr_clbk_data),
+                list_remove(node);
+                free(clbk_data_hndl);
+            }
         }
+        pthread_mutex_unlock(&clbk_data_list_lock);
     }
-    pthread_mutex_unlock(&clbk_data_list_lock);
-    }
+
     pthread_mutex_lock(&client_list_lock);
     if (client_list_init) {
         list_for_each_safe(node, tempnode, &client_list) {
@@ -909,15 +909,11 @@
     SrvrClbk  *sr_clbk_data = NULL, *tmp_sr_clbk_data = NULL;
     clbk_data *clbk_data_obj = NULL;
 
-    if ( this->Client_death_notifier == NULL ) {
-        this->Client_death_notifier = new client_death_notifier();
-        ALOGV("Client_death_notifier = %p", this->Client_death_notifier.get());
-    }
     int pid = ::android::hardware::IPCThreadState::self()->getCallingPid();
-    ALOGV("%s : client about to link to death with pid = %d\n", __func__, pid);
 
     if (cb != NULL) {
-        cb->linkToDeath(this->Client_death_notifier, pid);
+        bool newClient = true;
+
         ALOGV("%s : client linked to death with pid = %d\n", __func__, pid);
         sr_clbk_data = new SrvrClbk (session_id, cb, evt_type, ipc_client_data, pid);
         ALOGV("%s new SrvrClbk= %p, clntdata= %llx, sess id= %d, evt_type= %d \n",
@@ -930,7 +926,31 @@
             (const pthread_mutexattr_t *) NULL);
             list_init(&clbk_data_list);
             clbk_data_list_init = true;
+        } else {
+            struct listnode* node = NULL;
+            clbk_data* callbackData = NULL;
+            pthread_mutex_lock(&clbk_data_list_lock);
+
+            list_for_each(node, &clbk_data_list) {
+                callbackData = node_to_item(node, clbk_data, list);
+                if (callbackData->srv_clt_data->pid == pid) {
+                    ALOGV("client with pid %d already exists", pid);
+                    newClient = false;
+                    break;
+                }
+            }
+
+            pthread_mutex_unlock(&clbk_data_list_lock);
         }
+
+        if (newClient) {
+            if (mDeathNotifier == NULL) {
+                mDeathNotifier = new client_death_notifier();
+            }
+            ALOGI("linkToDeath for pid %d", pid);
+            cb->linkToDeath(mDeathNotifier, pid);
+        }
+
         clbk_data_obj = (clbk_data *)calloc(1, sizeof(clbk_data));
         if (clbk_data_obj == NULL) {
             ALOGE("%s: Cannot allocate memory for cb data object\n", __func__);