[Openais] [PATCH]: openais/trunk: TMR service cleanup on exit

Ryan O'Hara rohara at redhat.com
Thu Feb 12 08:22:25 PST 2009


This patch add/fixes the tmr_lib_exit_fn such that it will correctly
clean-up all timers when the process exits.

-------------- next part --------------
Index: services/tmr.c
===================================================================
--- services/tmr.c	(revision 1695)
+++ services/tmr.c	(working copy)
@@ -73,6 +73,7 @@
 	SaTimeT call_time;
 	void *timer_data;
 	struct list_head list;
+	struct list_head cleanup_list;
 };
 
 DECLARE_LIST_INIT(timer_list_head);
@@ -238,16 +239,33 @@
 
 static int tmr_lib_init_fn (void *conn)
 {
+	struct tmr_pd *tmr_pd = (struct tmr_pd *) api->ipc_private_data_get (conn);
+
+	list_init (&tmr_pd->timer_list);
+	list_init (&tmr_pd->timer_cleanup_list);
+
 	return (0);
 }
 
 static int tmr_lib_exit_fn (void *conn)
 {
+	struct timer *timer;
+	struct list_head *cleanup_list;
 	struct tmr_pd *tmr_pd = (struct tmr_pd *) api->ipc_private_data_get (conn);
 
-	list_init (&tmr_pd->timer_list);
-	list_init (&tmr_pd->timer_cleanup_list);
+	cleanup_list = tmr_pd->timer_cleanup_list.next;
 
+	while (!list_empty (&tmr_pd->timer_cleanup_list)) {
+
+		timer = list_entry (cleanup_list, struct timer, cleanup_list);
+
+		api->timer_delete (timer->timer_handle);
+		list_del (&timer->cleanup_list);
+		free (timer);
+
+		cleanup_list = tmr_pd->timer_cleanup_list.next;
+	}
+
 	return (0);
 }
 
@@ -354,6 +372,8 @@
 	SaAisErrorT error = SA_AIS_OK;
 	struct timer *timer = NULL;
 
+	struct tmr_pd *tmr_pd = (struct tmr_pd *) api->ipc_private_data_get (conn);
+
 	/* DEBUG */
 	log_printf (LOG_LEVEL_NOTICE, "LIB request: saTmrTimerStart { id=%u }\n",
 		    (unsigned int)(req_lib_tmr_timerstart->timer_id));
@@ -378,7 +398,10 @@
 		api->ipc_source_set (&timer->source, conn);
 
 		list_init (&timer->list);
+		list_init (&timer->cleanup_list);
+
 		list_add (&timer->list, &timer_list_head);
+		list_add (&timer->cleanup_list, &tmr_pd->timer_cleanup_list);
 
 		switch (timer->timer_attributes.type)
 		{
@@ -399,7 +422,7 @@
 			 * This case is handled in the library.
 			 */
 			break;
-		}
+		}	
 	}
 
 error_exit:


More information about the Openais mailing list