This patch complete the msgInstanceFinalize and queueInstanceFinalize
calls.

Also added list of queueInstances (queue_list) to msgInstance, which
is needed in order to finalize the queueInstances.

Ryan
Index: lib/msg.c
===================================================================
--- lib/msg.c   (revision 1921)
+++ lib/msg.c   (working copy)
@@ -67,6 +67,7 @@
        SaMsgHandleT msg_handle;
        SaMsgCallbacksT callbacks;
        int finalize;
+       struct list_head queue_list;
 };
 
 struct queueInstance {
@@ -77,6 +78,7 @@
        SaMsgQueueHandleT queue_handle;
        SaMsgQueueOpenFlagsT open_flags;
        SaMsgQueueCreationAttributesT create_attrs;
+       struct list_head list;
 };
 
 DECLARE_HDB_DATABASE(msgHandleDatabase, NULL);
@@ -92,19 +94,34 @@
        msgVersionsSupported
 };
 
-#ifdef COMPILE_OUT
-static void msgInstanceFinalize (struct msgInstance *msgInstance)
+static void queueInstanceFinalize (struct queueInstance *queueInstance)
 {
+       list_del (&queueInstance->list);
+
+       hdb_handle_destroy (&queueHandleDatabase, queueInstance->queue_handle);
+
        return;
 }
 
-static void queueInstanceFinalize (struct queueInstance *queueInstance)
+static void msgInstanceFinalize (struct msgInstance *msgInstance)
 {
+       struct queueInstance *queueInstance;
+       struct list_head *queueInstanceList;
+
+       queueInstanceList = msgInstance->queue_list.next;
+
+       while (queueInstanceList != &msgInstance->queue_list)
+       {
+               queueInstance = list_entry (queueInstanceList, struct 
queueInstance, list);
+               queueInstanceList = queueInstanceList->next;
+               queueInstanceFinalize (queueInstance);
+       }
+
+       hdb_handle_destroy (&msgHandleDatabase, msgInstance->msg_handle);
+
        return;
 }
 
-#endif /* COMPILE_OUT */
-
 SaAisErrorT
 saMsgInitialize (
        SaMsgHandleT *msgHandle,
@@ -152,6 +169,8 @@
                memset (&msgInstance->callbacks, 0, sizeof (SaMsgCallbacksT));
        }
 
+       list_init (&msgInstance->queue_list);
+
        msgInstance->msg_handle = *msgHandle;
 
        hdb_handle_put (&msgHandleDatabase, *msgHandle);
@@ -341,23 +360,25 @@
        error = hdb_error_to_sa (hdb_handle_get (&msgHandleDatabase,
                msgHandle, (void *)&msgInstance));
        if (error != SA_AIS_OK) {
-               return (error);
+               goto error_exit;
        }
 
        if (msgInstance->finalize) {
                hdb_handle_put (&msgHandleDatabase, msgHandle);
-               return (SA_AIS_ERR_BAD_HANDLE);
+               error = SA_AIS_ERR_BAD_HANDLE;
+               goto error_exit;
        }
 
        msgInstance->finalize = 1;
 
-       /* msgInstanceFinalize (msgInstance); */
+       coroipcc_service_disconnect (msgInstance->ipc_handle);
 
-       error = coroipcc_service_disconnect (msgInstance->ipc_handle); /* ? */
+       msgInstanceFinalize (msgInstance);
 
        hdb_handle_put (&msgHandleDatabase, msgHandle);
 
-       return (SA_AIS_OK);
+error_exit:
+       return (error);
 }
 
 SaAisErrorT
@@ -435,6 +456,7 @@
 
        queueInstance->ipc_handle = msgInstance->ipc_handle;
        queueInstance->open_flags = openFlags;
+       queueInstance->queue_handle = *queueHandle;
 
        req_lib_msg_queueopen.header.size =
                sizeof (struct req_lib_msg_queueopen);
@@ -481,6 +503,9 @@
 
        queueInstance->queue_id = res_lib_msg_queueopen.queue_id;
 
+       list_init (&queueInstance->list);
+       list_add_tail (&queueInstance->list, &msgInstance->queue_list);
+
        hdb_handle_put (&queueHandleDatabase, *queueHandle);
        hdb_handle_put (&msgHandleDatabase, msgHandle);
 
@@ -575,6 +600,7 @@
 
        queueInstance->ipc_handle = msgInstance->ipc_handle;
        queueInstance->open_flags = openFlags;
+       queueInstance->queue_handle = queueHandle;
 
        req_lib_msg_queueopenasync.header.size =
                sizeof (struct req_lib_msg_queueopenasync);
@@ -621,6 +647,9 @@
 
        queueInstance->queue_id = res_lib_msg_queueopenasync.queue_id;
 
+       list_init (&queueInstance->list);
+       list_add_tail (&queueInstance->list, &msgInstance->queue_list);
+
        hdb_handle_put (&queueHandleDatabase, queueHandle);
        hdb_handle_put (&msgHandleDatabase, msgHandle);
 
@@ -684,11 +713,13 @@
                goto error_put; /* ! */
        }
 
-       /*No Error -> destroy handle*/
+       list_del (&queueInstance->list);
+
        hdb_handle_put (&queueHandleDatabase, queueHandle);
        hdb_handle_destroy (&queueHandleDatabase, queueHandle);
 
        return (error);
+
 error_put:
        hdb_handle_put (&queueHandleDatabase, queueHandle);
 error_exit:
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to