[Libvirt-cim] [PATCH 3 of 3] Bring ComputerSystemIndication up to speed with new std_indication

Jay Gagnon grendel at linux.vnet.ibm.com
Mon Feb 25 20:57:05 UTC 2008


# HG changeset patch
# User Jay Gagnon <grendel at linux.vnet.ibm.com>
# Date 1203954964 18000
# Node ID 03485e8f9b04c3b6b01629116f436d6c78bee89e
# Parent  3434ff4b4321cc649d36cb15171cc1e685186f18
Bring ComputerSystemIndication up to speed with new std_indication

Move ind_args to std_indication
Switch from using CBDeliver to using stdi_deliver
Add new structs for new function table, enable/disable, filter mechanisms
Move CMPI_VOID check to std_indication
Pass ind_args around instead of individual components, add std_indication_ctx to ind_args.

Signed-off-by: Jay Gagnon <grendel at linux.vnet.ibm.com>

diff -r 3434ff4b4321 -r 03485e8f9b04 src/Virt_ComputerSystemIndication.c
--- a/src/Virt_ComputerSystemIndication.c	Mon Feb 25 10:54:15 2008 -0500
+++ b/src/Virt_ComputerSystemIndication.c	Mon Feb 25 10:56:04 2008 -0500
@@ -59,36 +59,14 @@ static bool lifecycle_enabled = 0;
 #define WAIT_TIME 180
 #define FAIL_WAIT_TIME 2
 
-#ifdef CMPI_EI_VOID
-# define _EI_RTYPE void
-# define _EI_RET() return
-#else
-# define _EI_RTYPE CMPIStatus
-# define _EI_RET() return (CMPIStatus){CMPI_RC_OK, NULL}
-#endif
-
 struct dom_xml {
         char uuid[VIR_UUID_STRING_BUFLEN];
         char *xml;
 };
 
-struct ind_args {
-        CMPIContext *context;
-        char *ns;
-        char *classname;
-};
-
 static void free_dom_xml (struct dom_xml dom)
 {
         free(dom.xml);
-}
-
-static void free_ind_args (struct ind_args **args)
-{
-        free((*args)->ns);
-        free((*args)->classname);
-        free(*args);
-        *args = NULL;
 }
 
 static char *sys_name_from_xml(char *xml)
@@ -168,7 +146,7 @@ static bool _do_indication(const CMPIBro
                            int ind_type,
                            const char *ind_type_name,
                            char *prefix,
-                           char *ns)
+                           struct ind_args *args)
 {
         CMPIObjectPath *affected_op;
         CMPIObjectPath *ind_op;
@@ -179,13 +157,13 @@ static bool _do_indication(const CMPIBro
         ind = get_typed_instance(broker,
                                  prefix,
                                  ind_type_name,
-                                 ns);
+                                 args->ns);
 
         /* Generally report errors and hope to continue, since we have no one 
            to actually return status to. */
         if (ind == NULL) {
                 CU_DEBUG("Failed to create ind, type '%s:%s_%s'", 
-                         ns,
+                         args->ns,
                          prefix,
                          ind_type_name);
                 ret = false;
@@ -218,10 +196,7 @@ static bool _do_indication(const CMPIBro
         CU_DEBUG("Delivering Indication: %s",
                  CMGetCharPtr(CMObjectPathToString(ind_op, NULL)));
 
-        CBDeliverIndication(broker,
-                            ctx,
-                            ns,
-                            ind);
+        stdi_deliver(broker, ctx, args, ind);
         CU_DEBUG("Delivered");
 
  out:
@@ -261,7 +236,7 @@ static bool async_ind(CMPIContext *conte
                       int ind_type,
                       struct dom_xml prev_dom,
                       char *prefix,
-                      char *ns)
+                      struct ind_args *args)
 {
         bool rc;
         char *name = NULL;
@@ -271,7 +246,7 @@ static bool async_ind(CMPIContext *conte
         affected_inst = get_typed_instance(_BROKER,
                                            prefix,
                                            "ComputerSystem",
-                                           ns);
+                                           args->ns);
 
         name = sys_name_from_xml(prev_dom.xml);
         CU_DEBUG("Name for system: '%s'", name);
@@ -298,7 +273,7 @@ static bool async_ind(CMPIContext *conte
                       (CMPIValue *)prev_dom.uuid, CMPI_chars);
 
         rc = _do_indication(_BROKER, context, affected_inst, 
-                            ind_type, type_name, prefix, ns);
+                            ind_type, type_name, prefix, args);
 
  out:
         free(name);
@@ -317,7 +292,6 @@ static CMPI_THREAD_RETURN lifecycle_thre
         struct dom_xml *prev_xml = NULL;
         virConnectPtr conn;
         char *prefix = class_prefix_name(args->classname);
-        char *ns = args->ns;
 
         conn = connect_by_classname(_BROKER, args->classname, &s);
         if (conn == NULL) {
@@ -358,7 +332,7 @@ static CMPI_THREAD_RETURN lifecycle_thre
                         res = dom_in_list(cur_xml[i].uuid, prev_count, prev_xml);
                         if (!res)
                                 async_ind(context, conn, CS_CREATED,
-                                          cur_xml[i], prefix, ns);
+                                          cur_xml[i], prefix, args);
 
                 }
 
@@ -366,14 +340,14 @@ static CMPI_THREAD_RETURN lifecycle_thre
                         res = dom_in_list(prev_xml[i].uuid, cur_count, cur_xml);
                         if (!res)
                                 async_ind(context, conn, CS_DELETED, 
-                                          prev_xml[i], prefix, ns);
+                                          prev_xml[i], prefix, args);
                 }
 
                 for (i = 0; i < prev_count; i++) {
                         res = dom_changed(prev_xml[i], cur_xml, cur_count);
                         if (res) {
                                 async_ind(context, conn, CS_MODIFIED, 
-                                          prev_xml[i], prefix, ns);
+                                          prev_xml[i], prefix, args);
 
                         }
                         free_dom_xml(prev_xml[i]);
@@ -393,7 +367,7 @@ static CMPI_THREAD_RETURN lifecycle_thre
 
  out:
         pthread_mutex_unlock(&lifecycle_mutex);
-        free_ind_args(&args);
+        stdi_free_ind_args(&args);
         free(prefix);
         virConnectClose(conn);
 
@@ -411,7 +385,10 @@ static CMPIStatus ActivateFilter(CMPIInd
 {
         CU_DEBUG("ActivateFilter");
         CMPIStatus s = {CMPI_RC_OK, NULL};
+        struct std_indication_ctx *_ctx;
         struct ind_args *args = malloc(sizeof(struct ind_args));
+
+        _ctx = (struct std_indication_ctx *)mi->hdl;
 
         if (CMIsNullObject(op)) {
                 cu_statusf(_BROKER, &s, 
@@ -421,6 +398,7 @@ static CMPIStatus ActivateFilter(CMPIInd
         }
         args->ns = strdup(NAMESPACE(op));
         args->classname = strdup(CLASSNAME(op));
+        args->_ctx = _ctx;
 
         if (lifecycle_thread_id == 0) {
                 args->context = CBPrepareAttachThread(_BROKER, ctx);
@@ -451,8 +429,6 @@ static _EI_RTYPE EnableIndications(CMPII
         lifecycle_enabled = true;
         pthread_mutex_unlock(&lifecycle_mutex);
 
-        CU_DEBUG("ComputerSystemIndication enabled");
-
         _EI_RET();
 }
 
@@ -463,8 +439,6 @@ static _EI_RTYPE DisableIndications(CMPI
         lifecycle_enabled = false;
         pthread_mutex_unlock(&lifecycle_mutex);
 
-        CU_DEBUG("ComputerSystemIndication disabled");
-
         _EI_RET();
 }
 
@@ -478,17 +452,34 @@ static struct std_indication_handler csi
 static struct std_indication_handler csi = {
         .raise_fn = NULL,
         .trigger_fn = trigger_indication,
+        .activate_fn = ActivateFilter,
+        .deactivate_fn = DeActivateFilter,
+        .enable_fn = EnableIndications,
+        .disable_fn = DisableIndications,
 };
+
+DECLARE_FILTER(xen_created, "Xen_ComputerSystemCreatedIndication");
+DECLARE_FILTER(xen_deleted, "Xen_ComputerSystemDeletedIndication");
+DECLARE_FILTER(xen_modified, "Xen_ComputerSystemModifiedIndication");
+
+static struct std_ind_filter *filters[] = {
+        &xen_created,
+        &xen_deleted,
+        &xen_modified,
+        NULL,
+};
+
 
 DEFAULT_IND_CLEANUP();
 DEFAULT_AF();
 DEFAULT_MP();
 
 STDI_IndicationMIStub(, 
-                      Virt_ComputerSystemIndication,
+                      Virt_ComputerSystemIndicationProvider,
                       _BROKER,
                       libvirt_cim_init(), 
-                      &csi);
+                      &csi,
+                      filters);
 
 /*
  * Local Variables:




More information about the Libvirt-cim mailing list