>From ad55cf9e7e812960bb187eee4a329903dabae760 Mon Sep 17 00:00:00 2001
From: Tim Meier <meier3@llnl.gov>
Date: Tue, 4 Mar 2008 17:09:25 -0800
Subject: [PATCH] opensm:  provide methods for getting the OpenSM and Log

This patch provides convenient access to the OpenSM
object and the OSM_Log.  Often methods just need to
log messages, and this allows them to get and use
the log, without involving the entire OpenSM object.

Signed-off-by: Tim Meier <meier3@llnl.gov>
---
 opensm/include/opensm/osm_opensm.h |    7 +++++++
 opensm/opensm/osm_opensm.c         |   31 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/opensm/include/opensm/osm_opensm.h b/opensm/include/opensm/osm_opensm.h
index cd1e73b..26294d5 100644
--- a/opensm/include/opensm/osm_opensm.h
+++ b/opensm/include/opensm/osm_opensm.h
@@ -500,6 +500,13 @@ osm_routing_engine_type_t osm_routing_engine_type(IN const char *str);
 * SEE ALSO
 *********/
 
+/* accessor functions - helps maintain "opaqueness"
+ *   opensm - the one and only super object
+ *   log    - the opensm log
+ */
+osm_opensm_t * osm_opensm_get_opensm(void);
+osm_log_t * osm_opensm_get_opensm_log(void);
+
 /* dump helpers */
 void osm_dump_mcast_routes(osm_opensm_t * osm);
 void osm_dump_all(osm_opensm_t * osm);
diff --git a/opensm/opensm/osm_opensm.c b/opensm/opensm/osm_opensm.c
index aa7ded3..c3ec259 100644
--- a/opensm/opensm/osm_opensm.c
+++ b/opensm/opensm/osm_opensm.c
@@ -68,6 +68,11 @@ struct routing_engine_module {
 	int (*setup) (osm_opensm_t * p_osm);
 };
 
+/*	
+ * A pointer to the OpenSM super object.  See osm_opensm_construct().
+ */
+static osm_opensm_t * p_osm_object = NULL;
+
 extern int osm_ucast_updn_setup(osm_opensm_t * p_osm);
 extern int osm_ucast_file_setup(osm_opensm_t * p_osm);
 extern int osm_ucast_ftree_setup(osm_opensm_t * p_osm);
@@ -170,6 +175,29 @@ static int osm_ucast_null_setup(osm_opensm_t * p_osm)
 
 /**********************************************************************
  **********************************************************************/
+osm_opensm_t * osm_opensm_get_opensm(void)
+{
+	/* an accessor method for the super object;
+	 *   preferred over passing pointer around as an argument
+	 */
+	CL_ASSERT(p_osm_object);
+	return p_osm_object;
+}
+
+/**********************************************************************
+ **********************************************************************/
+osm_log_t * osm_opensm_get_opensm_log(void)
+{
+	/* an accessor method for the osm log;
+	 *   preferred over passing pointer around as an argument
+	 */
+	CL_ASSERT(p_osm_object);
+	CL_ASSERT(&p_osm_object->log);
+	return &p_osm_object->log;
+}
+
+/**********************************************************************
+ **********************************************************************/
 void osm_opensm_construct(IN osm_opensm_t * const p_osm)
 {
 	memset(p_osm, 0, sizeof(*p_osm));
@@ -180,6 +208,7 @@ void osm_opensm_construct(IN osm_opensm_t * const p_osm)
 	osm_mad_pool_construct(&p_osm->mad_pool);
 	osm_vl15_construct(&p_osm->vl15);
 	osm_log_construct(&p_osm->log);
+	p_osm_object = p_osm;
 }
 
 /**********************************************************************
@@ -245,6 +274,8 @@ void osm_opensm_destroy(IN osm_opensm_t * const p_osm)
 	cl_plock_destroy(&p_osm->lock);
 
 	osm_log_destroy(&p_osm->log);
+	
+	p_osm_object = NULL;    /* prevent its use via assertions */
 }
 
 /**********************************************************************
-- 
1.5.1

