[Libvirt-cim] [PATCH 2/2] ComputerSystemIndication: Support libvirt domain events

Chip Vincent cvincent at linux.vnet.ibm.com
Fri Dec 30 16:07:52 UTC 2011


On 12/30/2011 06:24 AM, Wayne Xia wrote:
>    viewed the codes and no obvious problem found. Just one thing
> uncertain: this require libvirt0.9.0, does this affect existing user
> who have not latest libvirt installed? If not maybe old code should be
> kept.

Good point. I just did a quick check and found the following:
RHEL 6.0 -> libvirt-0.8.1-27
RHEL 6.1 -> libvirt-0.8.7-18
RHEL 6.2 -> libvirt-0.9.4-23

Sadly, we still have several exploiters who do not yet support RHEL 6.2, so
we need to maintain the legacy implementation too. I suggest we bump the
libvirt dependencies to 0.8.1 since it's reasonable to say we now support
RH 6+. The new domain event logic will need to be wrapped in some build
time checks in the source (#if LIBVIR_VERSION_NUMBER > 9000).

>    And is there some expected result I can get in wbemexec or wbemcli
>  to test the patch easily?
>
> 于 2011-12-30 1:55, Eduardo Lima (Etrunko) 写道:
>> From: Eduardo Lima (Etrunko)<eblima at br.ibm.com>
>>
>> Port current implementation to use domain events implementation provided by
>> libvirt. It requires libvirt version 0.9.0 or newer, when the
>> virEventRegisterDefaultImpl and virEventRunDefaultImpl API's were introduced.
>>
>> Now that all events are generated by libvirt itself, we don't need to trigger
>> them manually anymore. Thus, this patch also removes trigger and raise calls
>> from VirtualSystemManagementService and ComputerSystem providers.
>>
>> Signed-off-by: Eduardo Lima (Etrunko)<eblima at br.ibm.com>
>> ---
>>   acinclude.m4                              |    2 +-
>>   libvirt-cim.spec.in                       |    4 +-
>>   libxkutil/misc_util.c                     |    2 +
>>   src/Virt_ComputerSystem.c                 |   51 +--
>>   src/Virt_ComputerSystemIndication.c       |  759 ++++++++++++++---------------
>>   src/Virt_ComputerSystemIndication.h       |    5 -
>>   src/Virt_VirtualSystemManagementService.c |   30 +-
>>   7 files changed, 373 insertions(+), 480 deletions(-)
>>
>> diff --git a/acinclude.m4 b/acinclude.m4
>> index e313891..e0f76b6 100644
>> --- a/acinclude.m4
>> +++ b/acinclude.m4
>> @@ -243,7 +243,7 @@ AC_DEFUN([CHECK_LIBCU],
>>
>>   AC_DEFUN([CHECK_LIBVIRT],
>>       [
>> -    PKG_CHECK_MODULES([LIBVIRT], [libvirt>= 0.3.2])
>> +    PKG_CHECK_MODULES([LIBVIRT], [libvirt>= 0.9.0])
>>       AC_SUBST([LIBVIRT_CFLAGS])
>>       AC_SUBST([LIBVIRT_LIBS])
>>       CPPFLAGS="$CPPFLAGS $LIBVIRT_CFLAGS"
>> diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
>> index 5b7267b..f3289db 100644
>> --- a/libvirt-cim.spec.in
>> +++ b/libvirt-cim.spec.in
>> @@ -10,12 +10,12 @@ Source: libvirt-cim-%{version}.tar.gz
>>   BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
>>   URL: http://libvirt.org/CIM/
>>   Requires: libxml2>= 2.6.0
>> -Requires: libvirt>= 0.6.3
>> +Requires: libvirt>= 0.9.0
>>   Requires: unzip
>>   Requires: tog-pegasus
>>   BuildRequires: libcmpiutil>= 0.5.4
>>   BuildRequires: tog-pegasus-devel
>> -BuildRequires: libvirt-devel>= 0.6.3
>> +BuildRequires: libvirt-devel>= 0.9.0
>>
>>   # In RHEL5 uuid-devel is provided by e2fsprogs
>>   %if 0%{?el5}
>> diff --git a/libxkutil/misc_util.c b/libxkutil/misc_util.c
>> index 61893c3..556fe1f 100644
>> --- a/libxkutil/misc_util.c
>> +++ b/libxkutil/misc_util.c
>> @@ -607,6 +607,8 @@ bool libvirt_cim_init(void)
>>                           ret = virInitialize();
>>                           if (ret == 0)
>>                                   libvirt_initialized = 1;
>> +
>> +                        virEventRegisterDefaultImpl();
>>                   }
>>                   pthread_mutex_unlock(&libvirt_mutex);
>>           }
>> diff --git a/src/Virt_ComputerSystem.c b/src/Virt_ComputerSystem.c
>> index 098b07a..582253a 100644
>> --- a/src/Virt_ComputerSystem.c
>> +++ b/src/Virt_ComputerSystem.c
>> @@ -492,6 +492,7 @@ static CMPIStatus set_properties(const CMPIBroker *broker,
>>           }
>>
>>           if (!set_name_from_dom(dom, instance)) {
>> +                CU_DEBUG("Unable to get domain name");
>>                   virt_set_status(broker,&s,
>>                                   CMPI_RC_ERR_FAILED,
>>                                   virDomainGetConnect(dom),
>> @@ -500,6 +501,7 @@ static CMPIStatus set_properties(const CMPIBroker *broker,
>>           }
>>
>>           if (!set_uuid_from_dom(dom, instance,&uuid)) {
>> +                CU_DEBUG("Unable to get domain uuid");
>>                   virt_set_status(broker,&s,
>>                                   CMPI_RC_ERR_FAILED,
>>                                   virDomainGetConnect(dom),
>> @@ -514,6 +516,7 @@ static CMPIStatus set_properties(const CMPIBroker *broker,
>>           }
>>
>>           if (!set_state_from_dom(broker, dom, instance)) {
>> +                CU_DEBUG("Unable to get domain info");
>>                   virt_set_status(broker,&s,
>>                                   CMPI_RC_ERR_FAILED,
>>                                   virDomainGetConnect(dom),
>> @@ -660,6 +663,7 @@ CMPIStatus get_domain_by_name(const CMPIBroker *broker,
>>
>>           conn = connect_by_classname(broker, CLASSNAME(reference),&s);
>>           if (conn == NULL) {
>> +                CU_DEBUG("No such instance");
>>                   cu_statusf(broker,&s,
>>                              CMPI_RC_ERR_NOT_FOUND,
>>                              "No such instance.");
>> @@ -668,6 +672,7 @@ CMPIStatus get_domain_by_name(const CMPIBroker *broker,
>>
>>           dom = virDomainLookupByName(conn, name);
>>           if (dom == NULL) {
>> +                CU_DEBUG("Domain '%s' does not exist", name);
>>                   virt_set_status(broker,&s,
>>                                   CMPI_RC_ERR_NOT_FOUND,
>>                                   conn,
>> @@ -681,8 +686,10 @@ CMPIStatus get_domain_by_name(const CMPIBroker *broker,
>>                                 conn,
>>                                 dom,
>> &inst);
>> -        if (s.rc != CMPI_RC_OK)
>> +        if (s.rc != CMPI_RC_OK) {
>> +                CU_DEBUG("Unable to retrieve instance from domain");
>>                   goto out;
>> +        }
>>
>>           *_inst = inst;
>>
>> @@ -766,39 +773,6 @@ DEFAULT_DI();
>>   DEFAULT_EQ();
>>   DEFAULT_INST_CLEANUP();
>>
>> -static bool trigger_mod_indication(const CMPIContext *context,
>> -                                   CMPIInstance *prev_inst,
>> -                                   const CMPIObjectPath *ref)
>> -{
>> -        CMPIStatus s = {CMPI_RC_OK, NULL};
>> -        const char *ind_name = "ComputerSystemModifiedIndication";
>> -        CMPIInstance *ind = NULL;
>> -        char *type = NULL;
>> -
>> -        CU_DEBUG("Preparing ComputerSystem indication");
>> -
>> -        ind = get_typed_instance(_BROKER,
>> -                                 CLASSNAME(ref),
>> -                                 ind_name,
>> -                                 NAMESPACE(ref));
>> -        if (ind == NULL) {
>> -                CU_DEBUG("Failed to create ind '%s'", ind_name);
>> -                goto out;
>> -        }
>> -
>> -        CU_DEBUG("Setting PreviousInstance");
>> -        CMSetProperty(ind, "PreviousInstance",
>> -                      (CMPIValue *)&prev_inst, CMPI_instance);
>> -
>> -        type = get_typed_class(CLASSNAME(ref), ind_name);
>> -
>> -        s = stdi_raise_indication(_BROKER, context, type, NAMESPACE(ref), ind);
>> -
>> - out:
>> -        free(type);
>> -        return s.rc == CMPI_RC_OK;
>> -}
>> -
>>   static int xen_scheduler_params(struct infostore_ctx *ctx,
>>                                   virSchedParameter **params)
>>   {
>> @@ -1253,7 +1227,6 @@ static CMPIStatus state_change(CMPIMethodMI *self,
>>           int ret;
>>           const char *name = NULL;
>>           uint32_t rc = 1;
>> -        bool ind_rc;
>>
>>           ret = cu_get_u16_arg(argsin, "RequestedState",&state);
>>           if (ret != CMPI_RC_OK) {
>> @@ -1282,13 +1255,9 @@ static CMPIStatus state_change(CMPIMethodMI *self,
>>
>>           s = __state_change(name, state, reference);
>>
>> -        if (s.rc == CMPI_RC_OK) {
>> -                ind_rc= trigger_mod_indication(context, prev_inst, reference);
>> -                if (!ind_rc)
>> -                        CU_DEBUG("Unable to trigger indication");
>> -
>> +        if (s.rc == CMPI_RC_OK)
>>                   rc = 0;
>> -        }
>> +
>>    out:
>>           CMReturnData(results,&rc, CMPI_uint32);
>>
>> diff --git a/src/Virt_ComputerSystemIndication.c 
>> b/src/Virt_ComputerSystemIndication.c
>> index a00444d..0df73f3 100644
>> --- a/src/Virt_ComputerSystemIndication.c
>> +++ b/src/Virt_ComputerSystemIndication.c
>> @@ -25,13 +25,13 @@
>>   #include<string.h>
>>   #include<stdlib.h>
>>   #include<pthread.h>
>> -#include<time.h>
>>
>>   #include<cmpidt.h>
>>   #include<cmpift.h>
>>   #include<cmpimacs.h>
>>
>>   #include<libvirt/libvirt.h>
>> +#include<libvirt/virterror.h>
>>
>>   #include<libcmpiutil/libcmpiutil.h>
>>   #include<misc_util.h>
>> @@ -44,158 +44,187 @@
>>   #include "Virt_ComputerSystemIndication.h"
>>   #include "Virt_HostSystem.h"
>>
>> -static const CMPIBroker *_BROKER;
>>
>>   #define CSI_NUM_PLATFORMS 3
>> -enum CSI_PLATFORMS {CSI_XEN,
>> -                    CSI_KVM,
>> -                    CSI_LXC,
>> +enum CSI_PLATFORMS {
>> +        CSI_XEN,
>> +        CSI_KVM,
>> +        CSI_LXC,
>>   };
>>
>> -static CMPI_THREAD_TYPE thread_id[CSI_NUM_PLATFORMS];
>> -static int active_filters[CSI_NUM_PLATFORMS];
>> -
>> -enum CS_EVENTS {CS_CREATED,
>> -                CS_DELETED,
>> -                CS_MODIFIED,
>> +#define CS_NUM_EVENTS 3
>> +enum CS_EVENTS {
>> +        CS_CREATED,
>> +        CS_DELETED,
>> +        CS_MODIFIED,
>>   };
>>
>> -static pthread_cond_t lifecycle_cond = PTHREAD_COND_INITIALIZER;
>> -static pthread_mutex_t lifecycle_mutex = PTHREAD_MUTEX_INITIALIZER;
>> -static bool lifecycle_enabled = 0;
>> -
>> -#define WAIT_TIME 60
>> -#define FAIL_WAIT_TIME 2
>> -
>> -struct dom_xml {
>> +typedef struct _csi_dom_xml_t csi_dom_xml_t;
>> +struct _csi_dom_xml_t {
>>           char uuid[VIR_UUID_STRING_BUFLEN];
>> +        char *name;
>>           char *xml;
>> -        enum {DOM_OFFLINE,
>> -              DOM_ONLINE,
>> -              DOM_PAUSED,
>> -              DOM_CRASHED,
>> -              DOM_GONE,
>> -        } state;
>> +        csi_dom_xml_t *next;
>> +        csi_dom_xml_t *prev;
>> +};
>> +
>> +typedef struct _csi_thread_data_t csi_thread_data_t;
>> +struct _csi_thread_data_t {
>> +        CMPI_THREAD_TYPE id;
>> +        int active_filters;
>> +        int dom_count;
>> +        csi_dom_xml_t *dom_list;
>> +        struct ind_args *args;
>>   };
>>
>> -static void free_dom_xml (struct dom_xml dom)
>> +static const CMPIBroker *_BROKER;
>> +static pthread_mutex_t lifecycle_mutex = PTHREAD_MUTEX_INITIALIZER;
>> +static bool lifecycle_enabled = false;
>> +static csi_thread_data_t csi_thread_data[CSI_NUM_PLATFORMS] = {{0}, {0}, {0}};
>> +
>> +/*
>> + * Domain list manipulation
>> + */
>> +static void csi_dom_xml_free(csi_dom_xml_t *dom)
>>   {
>> -        free(dom.xml);
>> +        free(dom->xml);
>> +        free(dom->name);
>> +        free(dom);
>>   }
>>
>> -static char *sys_name_from_xml(char *xml)
>> +static int csi_dom_xml_set(csi_dom_xml_t *dom, virDomainPtr dom_ptr, 
>> CMPIStatus *s)
>>   {
>> -        char *tmp = NULL;
>> -        char *name = NULL;
>> -        int rc;
>> +        const char *name;
>>
>> -        tmp = strstr(xml, "<name>");
>> -        if (tmp == NULL)
>> -                goto out;
>> +        name = virDomainGetName(dom_ptr);
>> +        if (name == NULL) {
>> +                cu_statusf(_BROKER, s,
>> +                           CMPI_RC_ERR_FAILED,
>> +                           "Failed to get domain name");
>> +                return -1;
>> +        }
>>
>> -        rc = sscanf(tmp, "<name>%a[^<]s</name>",&name);
>> -        if (rc != 1)
>> -                name = NULL;
>> +        dom->name = strdup(name);
>> +
>> +        /* xml */
>> +        dom->xml = virDomainGetXMLDesc(dom_ptr, VIR_DOMAIN_XML_SECURE);
>> +        if (dom->xml == NULL) {
>> +                cu_statusf(_BROKER, s,
>> +                           CMPI_RC_ERR_FAILED,
>> +                           "Failed to get xml desc");
>> +                return -1;
>> +        }
>>
>> - out:
>> -        return name;
>> +        return 0;
>>   }
>>
>> -static int dom_state(virDomainPtr dom)
>> +static csi_dom_xml_t *csi_dom_xml_new(virDomainPtr dom_ptr, CMPIStatus *s)
>>   {
>> -        virDomainInfo info;
>> -        int ret;
>> +        int rc;
>> +        csi_dom_xml_t *dom;
>> +
>> +        dom = calloc(1, sizeof(*dom));
>> +        if (dom == NULL)
>> +                return NULL;
>> +
>> +        /* uuid */
>> +        rc = virDomainGetUUIDString(dom_ptr, dom->uuid);
>> +        if (rc == -1) {
>> +                cu_statusf(_BROKER, s,
>> +                           CMPI_RC_ERR_FAILED,
>> +                           "Failed to get domain UUID");
>> +                goto error;
>> +        }
>> +
>> +        if (csi_dom_xml_set(dom, dom_ptr, s) == -1)
>> +                goto error;
>>
>> -        ret = virDomainGetInfo(dom,&info);
>> -        if (ret != 0)
>> -                return DOM_GONE;
>> +        return dom;
>>
>> -        switch (info.state) {
>> -        case VIR_DOMAIN_NOSTATE:
>> -        case VIR_DOMAIN_RUNNING:
>> -        case VIR_DOMAIN_BLOCKED:
>> -                return DOM_ONLINE;
>> + error:
>> +        csi_dom_xml_free(dom);
>> +        return NULL;
>> +}
>>
>> -        case VIR_DOMAIN_PAUSED:
>> -                return DOM_PAUSED;
>> +static void csi_thread_dom_list_append(csi_thread_data_t *thread,
>> +                                       csi_dom_xml_t *dom)
>> +{
>> +        /* empty list */
>> +        if (thread->dom_list == NULL) {
>> +                dom->next = dom->prev = dom;
>> +                thread->dom_list = dom;
>> +                goto end;
>> +        }
>>
>> -        case VIR_DOMAIN_SHUTOFF:
>> -                return DOM_OFFLINE;
>> +        dom->next = thread->dom_list;
>> +        dom->prev = thread->dom_list->prev;
>>
>> -        case VIR_DOMAIN_CRASHED:
>> -                return DOM_CRASHED;
>> +        thread->dom_list->prev->next = dom;
>> +        thread->dom_list->prev = dom;
>>
>> -        default:
>> -                return DOM_GONE;
>> -        };
>> + end:
>> +        thread->dom_count += 1;
>>   }
>>
>> -static CMPIStatus doms_to_xml(struct dom_xml **dom_xml_list,
>> -                              virDomainPtr *dom_ptr_list,
>> -                              int dom_ptr_count)
>> +static csi_dom_xml_t *csi_thread_dom_list_find(csi_thread_data_t *thread,
>> +                                               const char *uuid)
>>   {
>> -        int i;
>> -        int rc;
>> -        CMPIStatus s = {CMPI_RC_OK, NULL};
>> +        csi_dom_xml_t *dom;
>>
>> -        *dom_xml_list = calloc(dom_ptr_count, sizeof(struct dom_xml));
>> -        for (i = 0; i<  dom_ptr_count; i++) {
>> -                rc = virDomainGetUUIDString(dom_ptr_list[i],
>> -                                            (*dom_xml_list)[i].uuid);
>> -                if (rc == -1) {
>> -                        cu_statusf(_BROKER,&s,
>> -                                   CMPI_RC_ERR_FAILED,
>> -                                   "Failed to get UUID");
>> -                        /* If any domain fails, we fail. */
>> -                        break;
>> -                }
>> +        if (thread->dom_list == NULL)
>> +                return NULL;
>>
>> -                (*dom_xml_list)[i].xml = virDomainGetXMLDesc(dom_ptr_list[i],
>> -                                                             
>> VIR_DOMAIN_XML_SECURE);
>> -                if ((*dom_xml_list)[i].xml == NULL) {
>> -                        cu_statusf(_BROKER,&s,
>> -                                   CMPI_RC_ERR_FAILED,
>> -                                   "Failed to get xml desc");
>> -                        break;
>> -                }
>> +        dom = thread->dom_list;
>>
>> -                (*dom_xml_list)[i].state = dom_state(dom_ptr_list[i]);
>> +        do {
>> +                if (STREQ(dom->uuid, uuid))
>> +                        return dom;
>> +
>> +                dom = dom->next;
>> +        } while (dom != thread->dom_list);
>> +
>> +        return NULL;
>> +}
>> +
>> +static void csi_thread_dom_list_remove(csi_thread_data_t *thread,
>> +                                       csi_dom_xml_t *dom)
>> +{
>> +        if (dom->next == dom) { /* Only one node */
>> +                thread->dom_list = NULL;
>> +        } else {
>> +                if (thread->dom_list == dom) /* First node */
>> +                        thread->dom_list = dom->next;
>> +
>> +                dom->prev->next = dom->next;
>> +                dom->next->prev = dom->prev;
>>           }
>> -
>> -        return s;
>> +
>> +        thread->dom_count -= 1;
>> +
>> +        csi_dom_xml_free(dom);
>>   }
>>
>> -static bool dom_changed(struct dom_xml prev_dom,
>> -                        struct dom_xml *cur_xml,
>> -                        int cur_count)
>> +static void csi_thread_dom_list_free(csi_thread_data_t *thread)
>>   {
>> -        int i;
>> -        bool ret = false;
>> -
>> -        for (i = 0; i<  cur_count; i++) {
>> -                if (strcmp(cur_xml[i].uuid, prev_dom.uuid) != 0)
>> -                        continue;
>> -
>> -                if (strcmp(cur_xml[i].xml, prev_dom.xml) != 0) {
>> -                        CU_DEBUG("Domain config changed");
>> -                        ret = true;
>> -                }
>> +        while(thread->dom_list != NULL)
>> +                csi_thread_dom_list_remove(thread, thread->dom_list);
>> +}
>>
>> -                if (prev_dom.state != cur_xml[i].state) {
>> -                        CU_DEBUG("Domain state changed");
>> -                        ret = true;
>> -                }
>> +static void csi_free_thread_data(void *data)
>> +{
>> +        csi_thread_data_t *thread = (csi_thread_data_t *) data;
>>
>> -                break;
>> -        }
>> -
>> -        return ret;
>> +        if (data == NULL)
>> +                return;
>> +
>> +        csi_thread_dom_list_free(thread);
>> +        stdi_free_ind_args(&thread->args);
>>   }
>>
>>   void set_source_inst_props(const CMPIBroker *broker,
>> -                                  const CMPIContext *context,
>> -                                  const CMPIObjectPath *ref,
>> -                                  CMPIInstance *ind)
>> +                           const CMPIContext *context,
>> +                           const CMPIObjectPath *ref,
>> +                           CMPIInstance *ind)
>>   {
>>           const char *host;
>>           const char *hostccn;
>> @@ -225,7 +254,7 @@ static bool _do_indication(const CMPIBroker *broker,
>>                              CMPIInstance *prev_inst,
>>                              CMPIInstance *affected_inst,
>>                              int ind_type,
>> -                           char *prefix,
>> +                           const char *prefix,
>>                              struct ind_args *args)
>>   {
>>           const char *ind_type_name = NULL;
>> @@ -254,10 +283,10 @@ static bool _do_indication(const CMPIBroker *broker,
>>                                    ind_type_name,
>>                                    args->ns);
>>
>> -        /* Generally report errors and hope to continue, since we have no one
>> +        /* 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'",
>> +                CU_DEBUG("Failed to create ind, type '%s:%s_%s'",
>>                            args->ns,
>>                            prefix,
>>                            ind_type_name);
>> @@ -279,14 +308,15 @@ static bool _do_indication(const CMPIBroker *broker,
>>                   CU_DEBUG("problem getting affected_op: '%s'", s.msg);
>>                   goto out;
>>           }
>> +
>>           CMSetNameSpace(affected_op, args->ns);
>>
>>           uuid = CMGetProperty(affected_inst, "UUID",&s);
>> -        CMSetProperty(ind, "IndicationIdentifier",
>> +        CMSetProperty(ind, "IndicationIdentifier",
>>                   (CMPIValue *)&(uuid.value), CMPI_string);
>>
>>           timestamp =  CMNewDateTime(broker,&s);
>> -        CMSetProperty(ind, "IndicationTime",
>> +        CMSetProperty(ind, "IndicationTime",
>>                   (CMPIValue *)&timestamp, CMPI_dateTime);
>>
>>           if (ind_type == CS_MODIFIED) {
>> @@ -313,34 +343,6 @@ static bool _do_indication(const CMPIBroker *broker,
>>           return ret;
>>   }
>>
>> -static bool wait_for_event(int wait_time)
>> -{
>> -        struct timespec timeout;
>> -        int ret;
>> -
>> -
>> -        clock_gettime(CLOCK_REALTIME,&timeout);
>> -        timeout.tv_sec += wait_time;
>> -
>> -        ret = pthread_cond_timedwait(&lifecycle_cond,
>> -&lifecycle_mutex,
>> -&timeout);
>> -
>> -        return true;
>> -}
>> -
>> -static bool dom_in_list(char *uuid, int count, struct dom_xml *list)
>> -{
>> -        int i;
>> -
>> -        for (i = 0; i<  count; i++) {
>> -                if (STREQ(uuid, list[i].uuid))
>> -                        return true;
>> -        }
>> -
>> -        return false;
>> -}
>> -
>>   static bool set_instance_state(CMPIInstance *instance)
>>   {
>>           CMPIStatus s = {CMPI_RC_OK, NULL};
>> @@ -356,7 +358,7 @@ static bool set_instance_state(CMPIInstance *instance)
>>           cim_state_other = CMNewString(_BROKER, "Guest destroyed",&s);
>>           CMSetProperty(instance, "EnabledState",
>>                         (CMPIValue *)&cim_state, CMPI_uint16);
>> -        CMSetProperty(instance, "OtherEnabledState",
>> +        CMSetProperty(instance, "OtherEnabledState",
>>                         (CMPIValue *)&cim_state_other, CMPI_string);
>>
>>           health_state = CIM_HEALTH_UNKNOWN;
>> @@ -382,13 +384,13 @@ static bool set_instance_state(CMPIInstance *instance)
>>           req_state = CIM_STATE_UNKNOWN;
>>           CMSetProperty(instance, "RequestedState",
>>                         (CMPIValue *)&req_state, CMPI_uint16);
>> -
>> +
>>           return true;
>>   }
>>
>> -static bool create_deleted_guest_inst(char *xml,
>> -                                      char *namespace,
>> -                                      char *prefix,
>> +static bool create_deleted_guest_inst(const char *xml,
>> +                                      const char *namespace,
>> +                                      const char *prefix,
>>                                         CMPIInstance **inst)
>>   {
>>           bool rc = false;
>> @@ -402,18 +404,18 @@ static bool create_deleted_guest_inst(char *xml,
>>                   goto out;
>>           }
>>
>> -        s = instance_from_dominfo(_BROKER,
>> -                                  namespace,
>> +        s = instance_from_dominfo(_BROKER,
>> +                                  namespace,
>>                                     prefix,
>> -                                  dominfo,
>> -                                  inst);
>> +                                  dominfo,
>> +                                  inst);
>>           if (s.rc != CMPI_RC_OK) {
>>                   CU_DEBUG("instance from domain info error: %s", s.msg);
>>                   goto out;
>>           }
>>
>>           rc = set_instance_state(*inst);
>> -        if (!rc)
>> +        if (!rc)
>>                   CU_DEBUG("Error setting instance state");
>>
>>    out:
>> @@ -422,14 +424,12 @@ static bool create_deleted_guest_inst(char *xml,
>>           return rc;
>>   }
>>
>> -static bool async_ind(CMPIContext *context,
>> +static bool async_ind(struct ind_args *args,
>>                         int ind_type,
>> -                      struct dom_xml prev_dom,
>> -                      char *prefix,
>> -                      struct ind_args *args)
>> +                      csi_dom_xml_t *dom,
>> +                      const char *prefix)
>>   {
>>           bool rc = false;
>> -        char *name = NULL;
>>           char *cn = NULL;
>>           CMPIObjectPath *op;
>>           CMPIInstance *prev_inst;
>> @@ -441,13 +441,6 @@ static bool async_ind(CMPIContext *context,
>>                   return false;
>>           }
>>
>> -        name = sys_name_from_xml(prev_dom.xml);
>> -        CU_DEBUG("Name for system: '%s'", name);
>> -        if (name == NULL) {
>> -                rc = false;
>> -                goto out;
>> -        }
>> -
>>           cn = get_typed_class(prefix, "ComputerSystem");
>>
>>           op = CMNewObjectPath(_BROKER, args->ns, cn,&s);
>> @@ -457,15 +450,32 @@ static bool async_ind(CMPIContext *context,
>>           }
>>
>>           if (ind_type == CS_CREATED || ind_type == CS_MODIFIED) {
>> -                s = get_domain_by_name(_BROKER, op, name,&affected_inst);
>> -                if (s.rc != CMPI_RC_OK) {
>> +                s = get_domain_by_name(_BROKER, op, dom->name,&affected_inst);
>> +
>> +                /* If domain is not found, we create the instance from the data
>> +                   previously stored */
>> +                if (s.rc == CMPI_RC_ERR_NOT_FOUND) {
>> +                        rc = create_deleted_guest_inst(dom->xml,
>> +                                                       args->ns,
>> +                                                       prefix,
>> +&affected_inst);
>> +                         if (!rc) {
>> +                                CU_DEBUG("Could not recreate guest instance");
>> +                                goto out;
>> +                         }
>> +
>> +                         s.rc = CMPI_RC_OK;
>> +                }
>> +
>> +                if (s.rc != CMPI_RC_OK) {
>>                           CU_DEBUG("domain by name error");
>>                           goto out;
>>                   }
>> +
>>           } else if (ind_type == CS_DELETED) {
>> -                rc = create_deleted_guest_inst(prev_dom.xml,
>> -                                               args->ns,
>> -                                               prefix,
>> +                rc = create_deleted_guest_inst(dom->xml,
>> +                                               args->ns,
>> +                                               prefix,
>> &affected_inst);
>>                   if (!rc) {
>>                           CU_DEBUG("Could not recreate guest instance");
>> @@ -476,52 +486,134 @@ static bool async_ind(CMPIContext *context,
>>                   goto out;
>>           }
>>
>> -        /* FIXME: We are unable to get the previous CS instance after it has
>> +        /* FIXME: We are unable to get the previous CS instance after it has
>>                     been modified. Consider keeping track of the previous
>> -                  state in the place we keep track of the requested state */
>> +                  state in the place we keep track of the requested state */
>>           prev_inst = affected_inst;
>>
>> -        CMSetProperty(affected_inst, "Name",
>> -                      (CMPIValue *)name, CMPI_chars);
>> +        CMSetProperty(affected_inst, "Name",
>> +                      (CMPIValue *) dom->name, CMPI_chars);
>>           CMSetProperty(affected_inst, "UUID",
>> -                      (CMPIValue *)prev_dom.uuid, CMPI_chars);
>> +                      (CMPIValue *) dom->uuid, CMPI_chars);
>>
>> -        rc = _do_indication(_BROKER, context, prev_inst, affected_inst,
>> +        rc = _do_indication(_BROKER, args->context, prev_inst, affected_inst,
>>                               ind_type, prefix, args);
>>
>>    out:
>>           free(cn);
>> -        free(name);
>>           return rc;
>>   }
>>
>> -static int platform_from_class(const char *cn)
>> +static int update_domain_list(virConnectPtr conn, csi_thread_data_t *thread)
>>   {
>> -        if (STARTS_WITH(cn, "Xen"))
>> -                return CSI_XEN;
>> -        else if (STARTS_WITH(cn, "KVM"))
>> -                return CSI_KVM;
>> -        else if (STARTS_WITH(cn, "LXC"))
>> -                return CSI_LXC;
>> -        else
>> -                return -1;
>> +        virDomainPtr *dom_ptr_list;
>> +        csi_dom_xml_t *dom;
>> +        CMPIStatus s = {CMPI_RC_OK, NULL};
>> +        int i, count;
>> +
>> +        csi_thread_dom_list_free(thread);
>> +
>> +        count = get_domain_list(conn,&dom_ptr_list);
>> +
>> +        for (i = 0; i<  count; i++) {
>> +                dom = csi_dom_xml_new(dom_ptr_list[i],&s);
>> +                if (dom == NULL) {
>> +                        CU_DEBUG("Failed to get domain info %s", s.msg);
>> +                        break;
>> +                }
>> +
>> +                csi_thread_dom_list_append(thread, dom);
>> +        }
>> +
>> +        free_domain_list(dom_ptr_list, count);
>> +        free(dom_ptr_list);
>> +
>> +        return s.rc;
>> +}
>> +
>> +static int csi_domain_event_cb(virConnectPtr conn,
>> +                               virDomainPtr dom,
>> +                               int event,
>> +                               int detail,
>> +                               void *data)
>> +{
>> +        int cs_event = CS_MODIFIED;
>> +        csi_thread_data_t *thread = (csi_thread_data_t *) data;
>> +        csi_dom_xml_t *dom_xml = NULL;
>> +        char *prefix = class_prefix_name(thread->args->classname);
>> +        CMPIStatus s = {CMPI_RC_OK, NULL};
>> +
>> +        CU_DEBUG("Event: Domain %s(%d) event: %d detail: %d\n",
>> +                 virDomainGetName(dom), virDomainGetID(dom), event, detail);
>> +
>> +        switch (event) {
>> +        case VIR_DOMAIN_EVENT_DEFINED:
>> +                if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED) {
>> +                        CU_DEBUG("Domain defined");
>> +                        cs_event = CS_CREATED;
>> +                        dom_xml = csi_dom_xml_new(dom,&s);
>> +                } else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED) {
>> +                        CU_DEBUG("Domain modified");
>> +                        cs_event = CS_MODIFIED;
>> +                }
>> +
>> +                break;
>> +
>> +        case VIR_DOMAIN_EVENT_UNDEFINED:
>> +                CU_DEBUG("Domain undefined");
>> +                cs_event = CS_DELETED;
>> +                break;
>> +
>> +        default: /* STARTED, SUSPENDED, RESUMED, STOPPED, SHUTDOWN */
>> +                CU_DEBUG("Domain modified");
>> +                cs_event = CS_MODIFIED;
>> +                break;
>> +        }
>> +
>> +        if (cs_event != CS_CREATED) {
>> +                char uuid[VIR_UUID_STRING_BUFLEN] = {0};
>> +                virDomainGetUUIDString(dom,&uuid[0]);
>> +                dom_xml = csi_thread_dom_list_find(thread, uuid);
>> +        }
>> +
>> +        if (dom_xml == NULL) {
>> +                CU_DEBUG("Domain not found in current list");
>> +                goto end;
>> +        }
>> +
>> +        async_ind(thread->args, cs_event, dom_xml, prefix);
>> +
>> +        /* Update the domain list accordingly */
>> +        if (event == VIR_DOMAIN_EVENT_DEFINED) {
>> +                if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED) {
>> +                        csi_thread_dom_list_append(thread, dom_xml);
>> +                } else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED) {
>> +                        free(dom_xml->name);
>> +                        free(dom_xml->xml);
>> +                        csi_dom_xml_set(dom_xml, dom,&s);
>> +                }
>> +        } else if (event == VIR_DOMAIN_EVENT_DEFINED&&
>> +                   detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED) {
>> +                csi_thread_dom_list_remove(thread, dom_xml);
>> +        }
>> +
>> + end:
>> +        free(prefix);
>> +        return 0;
>>   }
>>
>>   static CMPI_THREAD_RETURN lifecycle_thread(void *params)
>>   {
>> -        struct ind_args *args = (struct ind_args *)params;
>> -        CMPIContext *context = args->context;
>> -        CMPIStatus s;
>> -        int prev_count;
>> -        int cur_count;
>> -        virDomainPtr *tmp_list;
>> -        struct dom_xml *cur_xml = NULL;
>> -        struct dom_xml *prev_xml = NULL;
>> -        virConnectPtr conn;
>> +        csi_thread_data_t *thread = (csi_thread_data_t *) params;
>> +        struct ind_args *args = thread->args;
>>           char *prefix = class_prefix_name(args->classname);
>> -        int platform = platform_from_class(args->classname);
>>
>> -        if (prefix == NULL || platform == -1)
>> +        virConnectPtr conn;
>> +
>> +        CMPIStatus s;
>> +        int cb_id;
>> +
>> +        if (prefix == NULL)
>>                   goto init_out;
>>
>>           conn = connect_by_classname(_BROKER, args->classname,&s);
>> @@ -531,86 +623,65 @@ static CMPI_THREAD_RETURN lifecycle_thread(void *params)
>>                   goto conn_out;
>>           }
>>
>> -        pthread_mutex_lock(&lifecycle_mutex);
>> -
>> -        CBAttachThread(_BROKER, context);
>> -
>> -        prev_count = get_domain_list(conn,&tmp_list);
>> -        s = doms_to_xml(&prev_xml, tmp_list, prev_count);
>> -        if (s.rc != CMPI_RC_OK)
>> -                CU_DEBUG("doms_to_xml failed.  Attempting to continue.");
>> -        free_domain_list(tmp_list, prev_count);
>> -        free(tmp_list);
>> -
>> -        CU_DEBUG("Entering CSI event loop (%s)", prefix);
>> -        while (active_filters[platform]>  0) {
>> -                int i;
>> -                bool res;
>> -                bool failure = false;
>> -
>> -                cur_count = get_domain_list(conn,&tmp_list);
>> -                s = doms_to_xml(&cur_xml, tmp_list, cur_count);
>> -                if (s.rc != CMPI_RC_OK) {
>> -                        CU_DEBUG("doms_to_xml failed. retry in %d seconds",
>> -                                 FAIL_WAIT_TIME);
>> -                        failure = true;
>> -                        goto fail;
>> -                }
>> -
>> -                free_domain_list(tmp_list, cur_count);
>> -                free(tmp_list);
>> -
>> -                for (i = 0; i<  cur_count; i++) {
>> -                        res = dom_in_list(cur_xml[i].uuid, prev_count, 
>> prev_xml);
>> -                        if (!res)
>> -                                async_ind(context, CS_CREATED,
>> -                                          cur_xml[i], prefix, args);
>> -
>> -                }
>> +        /* register callback */
>> +        cb_id = virConnectDomainEventRegisterAny(conn, NULL,
>> +                                VIR_DOMAIN_EVENT_ID_LIFECYCLE,
>> +                                VIR_DOMAIN_EVENT_CALLBACK(csi_domain_event_cb),
>> +                                params, csi_free_thread_data);
>>
>> -                for (i = 0; i<  prev_count; i++) {
>> -                        res = dom_in_list(prev_xml[i].uuid, cur_count, 
>> cur_xml);
>> -                        if (!res)
>> -                                async_ind(context, CS_DELETED,
>> -                                          prev_xml[i], prefix, args);
>> -                }
>> +        if (cb_id == -1) {
>> +                CU_DEBUG("Failed to register domain event watch for '%s'",
>> +                         args->classname)
>> +                goto cb_out;
>> +        }
>>
>> -                for (i = 0; i<  prev_count; i++) {
>> -                        res = dom_changed(prev_xml[i], cur_xml, cur_count);
>> -                        if (res) {
>> -                                async_ind(context, CS_MODIFIED,
>> -                                          prev_xml[i], prefix, args);
>> +        CBAttachThread(_BROKER, args->context);
>>
>> -                        }
>> -                        free_dom_xml(prev_xml[i]);
>> -                }
>> +        /* Get currently defined domains */
>> +        if (update_domain_list(conn, thread) != CMPI_RC_OK)
>> +                goto end;
>>
>> -        fail:
>> -                if (failure) {
>> -                        wait_for_event(FAIL_WAIT_TIME);
>> -                } else {
>> -                        free(prev_xml);
>> -                        prev_xml = cur_xml;
>> -                        prev_count = cur_count;
>>
>> -                        wait_for_event(WAIT_TIME);
>> +        CU_DEBUG("Entering CSI event loop (%s)", prefix);
>> +        while (thread->active_filters>  0) {
>> +                if (virEventRunDefaultImpl()<  0) {
>> +                        virErrorPtr err = virGetLastError();
>> +                        CU_DEBUG("Failed to run event loop: %s\n",
>> +                        err&&  err->message ? err->message : "Unknown error");
>>                   }
>>           }
>>
>>           CU_DEBUG("Exiting CSI event loop (%s)", prefix);
>>
>> -        thread_id[platform] = 0;
>> + end:
>> +        virConnectDomainEventDeregisterAny(conn, cb_id);
>>
>> -        pthread_mutex_unlock(&lifecycle_mutex);
>> -        stdi_free_ind_args(&args);
>> + cb_out:
>> +
>> +        thread->id = 0;
>> +        thread->active_filters = 0;
>> +
>> +        if (thread->args != NULL)
>> +                stdi_free_ind_args(&thread->args);
>>
>>    conn_out:
>>           virConnectClose(conn);
>>
>>    init_out:
>>           free(prefix);
>> +        return (CMPI_THREAD_RETURN) 0;
>> +}
>>
>> -        return NULL;
>> +static int platform_from_class(const char *cn)
>> +{
>> +        if (STARTS_WITH(cn, "Xen"))
>> +                return CSI_XEN;
>> +        else if (STARTS_WITH(cn, "KVM"))
>> +                return CSI_KVM;
>> +        else if (STARTS_WITH(cn, "LXC"))
>> +                return CSI_LXC;
>> +        else
>> +                return -1;
>>   }
>>
>>   static CMPIStatus ActivateFilter(CMPIIndicationMI* mi,
>> @@ -622,8 +693,10 @@ static CMPIStatus ActivateFilter(CMPIIndicationMI* mi,
>>   {
>>           CMPIStatus s = {CMPI_RC_OK, NULL};
>>           struct std_indication_ctx *_ctx;
>> -        struct ind_args *args;
>> +        struct ind_args *args = NULL;
>>           int platform;
>> +        bool error = false;
>> +        csi_thread_data_t *thread = NULL;
>>
>>           CU_DEBUG("ActivateFilter for %s", CLASSNAME(op));
>>
>> @@ -632,7 +705,7 @@ static CMPIStatus ActivateFilter(CMPIIndicationMI* mi,
>>           _ctx = (struct std_indication_ctx *)mi->hdl;
>>
>>           if (CMIsNullObject(op)) {
>> -                cu_statusf(_BROKER,&s,
>> +                cu_statusf(_BROKER,&s,
>>                              CMPI_RC_ERR_FAILED,
>>                              "No ObjectPath given");
>>                   goto out;
>> @@ -647,13 +720,17 @@ static CMPIStatus ActivateFilter(CMPIIndicationMI* mi,
>>                   goto out;
>>           }
>>
>> -        if (thread_id[platform] == 0) {
>> -                args = malloc(sizeof(struct ind_args));
>> +        thread =&csi_thread_data[platform];
>> +        thread->active_filters += 1;
>> +
>> +        if (thread->id == 0) {
>> +                args = malloc(sizeof(*args));
>>                   if (args == NULL) {
>>                           CU_DEBUG("Failed to allocate ind_args");
>>                           cu_statusf(_BROKER,&s,
>>                                      CMPI_RC_ERR_FAILED,
>>                                      "Unable to allocate ind_args");
>> +                        error = true;
>>                           goto out;
>>                   }
>>
>> @@ -663,7 +740,7 @@ static CMPIStatus ActivateFilter(CMPIIndicationMI* mi,
>>                           cu_statusf(_BROKER,&s,
>>                                      CMPI_RC_ERR_FAILED,
>>                                      "Unable to create thread context");
>> -                        free(args);
>> +                        error = true;
>>                           goto out;
>>                   }
>>
>> @@ -671,15 +748,17 @@ static CMPIStatus ActivateFilter(CMPIIndicationMI* mi,
>>                   args->classname = strdup(CLASSNAME(op));
>>                   args->_ctx = _ctx;
>>
>> -                active_filters[platform] += 1;
>> -
>> -                thread_id[platform] = _BROKER->xft->newThread(lifecycle_thread,
>> -                                                              args,
>> -                                                              0);
>> -        } else
>> -                active_filters[platform] += 1;
>> +                thread->args = args;
>> +                thread->id = _BROKER->xft->newThread(lifecycle_thread,
>> +                                                     thread, 0);
>> +        }
>>
>>    out:
>> +        if (error == true) {
>> +                thread->active_filters -= 1;
>> +                free(args);
>> +        }
>> +
>>           pthread_mutex_unlock(&lifecycle_mutex);
>>
>>           return s;
>> @@ -705,11 +784,11 @@ static CMPIStatus DeActivateFilter(CMPIIndicationMI* mi,
>>                   goto out;
>>           }
>>
>> +
>>           pthread_mutex_lock(&lifecycle_mutex);
>> -        active_filters[platform] -= 1;
>> +        csi_thread_data[platform].active_filters -= 1;
>>           pthread_mutex_unlock(&lifecycle_mutex);
>>
>> -        pthread_cond_signal(&lifecycle_cond);
>>    out:
>>           return s;
>>   }
>> @@ -736,13 +815,6 @@ static _EI_RTYPE DisableIndications(CMPIIndicationMI* mi,
>>           _EI_RET();
>>   }
>>
>> -static CMPIStatus trigger_indication(const CMPIContext *context)
>> -{
>> -        CU_DEBUG("triggered");
>> -        pthread_cond_signal(&lifecycle_cond);
>> -        return(CMPIStatus){CMPI_RC_OK, NULL};
>> -}
>> -
>>   DECLARE_FILTER(xen_created, "Xen_ComputerSystemCreatedIndication");
>>   DECLARE_FILTER(xen_deleted, "Xen_ComputerSystemDeletedIndication");
>>   DECLARE_FILTER(xen_modified, "Xen_ComputerSystemModifiedIndication");
>> @@ -766,126 +838,7 @@ static struct std_ind_filter *filters[] = {
>>           NULL,
>>   };
>>
>> -static CMPIInstance *get_prev_inst(const CMPIBroker *broker,
>> -                                   const CMPIInstance *ind,
>> -                                   CMPIStatus *s)
>> -{
>> -        CMPIData data;
>> -        CMPIInstance *prev_inst = NULL;
>> -
>> -        data = CMGetProperty(ind, "PreviousInstance", s);
>> -        if (s->rc != CMPI_RC_OK || CMIsNullValue(data)) {
>> -                cu_statusf(broker, s,
>> -                           CMPI_RC_ERR_NO_SUCH_PROPERTY,
>> -                           "Unable to get PreviousInstance of the indication");
>> -                goto out;
>> -        }
>> -
>> -        if (data.type != CMPI_instance) {
>> -                cu_statusf(broker, s,
>> -                           CMPI_RC_ERR_TYPE_MISMATCH,
>> -                           "Indication SourceInstance is of unexpected type");
>> -                goto out;
>> -        }
>> -
>> -        prev_inst = data.value.inst;
>> -
>> - out:
>> -        return prev_inst;
>> -}
>> -
>> -static CMPIStatus raise_indication(const CMPIBroker *broker,
>> -                                   const CMPIContext *ctx,
>> -                                   const CMPIObjectPath *ref,
>> -                                   const CMPIInstance *ind)
>> -{
>> -        CMPIStatus s = {CMPI_RC_OK, NULL};
>> -        CMPIInstance *prev_inst;
>> -        CMPIInstance *src_inst;
>> -        CMPIObjectPath *_ref = NULL;
>> -        struct std_indication_ctx *_ctx = NULL;
>> -        struct ind_args *args = NULL;
>> -        char *prefix = NULL;
>> -        bool rc;
>> -
>> -        if (!lifecycle_enabled) {
>> -                cu_statusf(_BROKER,&s,
>> -                           CMPI_RC_ERR_FAILED,
>> -                           "CSI not enabled, skipping indication delivery");
>> -                goto out;
>> -        }
>> -
>> -        prev_inst = get_prev_inst(broker, ind,&s);
>> -        if (s.rc != CMPI_RC_OK || CMIsNullObject(prev_inst))
>> -                goto out;
>> -
>> -        _ref = CMGetObjectPath(prev_inst,&s);
>> -        if (s.rc != CMPI_RC_OK) {
>> -                cu_statusf(broker,&s,
>> -                           CMPI_RC_ERR_FAILED,
>> -                           "Unable to get a reference to the guest");
>> -                goto out;
>> -        }
>> -
>> -        /* FIXME:  This is a Pegasus work around. Pegsus loses the namespace
>> -                   when an ObjectPath is pulled from an instance */
>> -        if (STREQ(NAMESPACE(_ref), ""))
>> -                CMSetNameSpace(_ref, "root/virt");
>> -
>> -        s = get_domain_by_ref(broker, _ref,&src_inst);
>> -        if (s.rc != CMPI_RC_OK || CMIsNullObject(src_inst))
>> -                goto out;
>> -
>> -        _ctx = malloc(sizeof(struct std_indication_ctx));
>> -        if (_ctx == NULL) {
>> -                cu_statusf(broker,&s,
>> -                           CMPI_RC_ERR_FAILED,
>> -                           "Unable to allocate indication context");
>> -                goto out;
>> -        }
>> -
>> -        _ctx->brkr = broker;
>> -        _ctx->handler = NULL;
>> -        _ctx->filters = filters;
>> -        _ctx->enabled = lifecycle_enabled;
>> -
>> -        args = malloc(sizeof(struct ind_args));
>> -        if (args == NULL) {
>> -                cu_statusf(broker,&s,
>> -                           CMPI_RC_ERR_FAILED,
>> -                           "Unable to allocate ind_args");
>> -                goto out;
>> -        }
>> -
>> -        args->ns = strdup(NAMESPACE(_ref));
>> -        args->classname = strdup(CLASSNAME(_ref));
>> -        args->_ctx = _ctx;
>> -
>> -        prefix = class_prefix_name(args->classname);
>> -
>> -        rc = _do_indication(broker, ctx, prev_inst, src_inst,
>> -                            CS_MODIFIED, prefix, args);
>> -
>> -        if (!rc) {
>> -                cu_statusf(_BROKER,&s,
>> -                           CMPI_RC_ERR_FAILED,
>> -                           "Unable to generate indication");
>> -        }
>> -
>> - out:
>> -        if (args != NULL)
>> -                stdi_free_ind_args(&args);
>> -
>> -        if (_ctx != NULL)
>> -                free(_ctx);
>> -
>> -        free(prefix);
>> -        return s;
>> -}
>> -
>>   static struct std_indication_handler csi = {
>> -        .raise_fn = raise_indication,
>> -        .trigger_fn = trigger_indication,
>>           .activate_fn = ActivateFilter,
>>           .deactivate_fn = DeActivateFilter,
>>           .enable_fn = EnableIndications,
>> @@ -896,10 +849,10 @@ DEFAULT_IND_CLEANUP();
>>   DEFAULT_AF();
>>   DEFAULT_MP();
>>
>> -STDI_IndicationMIStub(,
>> +STDI_IndicationMIStub(,
>>                         Virt_ComputerSystemIndicationProvider,
>>                         _BROKER,
>> -                      libvirt_cim_init(),
>> +                      libvirt_cim_init(),
>> &csi,
>>                         filters);
>>
>> diff --git a/src/Virt_ComputerSystemIndication.h 
>> b/src/Virt_ComputerSystemIndication.h
>> index 0f8f1b7..594c3ed 100644
>> --- a/src/Virt_ComputerSystemIndication.h
>> +++ b/src/Virt_ComputerSystemIndication.h
>> @@ -24,11 +24,6 @@
>>   #include<cmpidt.h>
>>   #include<stdbool.h>
>>
>> -bool cs_lifecycle_indication(const CMPIBroker *broker,
>> -                             const CMPIContext *ctx,
>> -                             const CMPIObjectPath *newsystem,
>> -                             char *type);
>> -
>>   void set_source_inst_props(const CMPIBroker *broker,
>>                              const CMPIContext *context,
>>                              const CMPIObjectPath *ref,
>> diff --git a/src/Virt_VirtualSystemManagementService.c 
>> b/src/Virt_VirtualSystemManagementService.c
>> index 4d26429..46bc9b5 100644
>> --- a/src/Virt_VirtualSystemManagementService.c
>> +++ b/src/Virt_VirtualSystemManagementService.c
>> @@ -1894,7 +1894,7 @@ static CMPIStatus raise_rasd_indication(const 
>> CMPIContext *context,
>>           CMPIObjectPath *op = NULL;
>>           int i;
>>
>> -        CU_DEBUG("raise_rasd_indication");
>> +        CU_DEBUG("raise_rasd_indication %s", base_type);
>>
>>           type = get_typed_class(CLASSNAME(ref), base_type);
>>
>> @@ -2105,22 +2105,6 @@ static CMPIInstance *create_system(const CMPIContext 
>> *context,
>>           return inst;
>>   }
>>
>> -static bool trigger_indication(const CMPIContext *context,
>> -                               const char *base_type,
>> -                               const CMPIObjectPath *ref)
>> -{
>> -        char *type;
>> -        CMPIStatus s;
>> -
>> -        type = get_typed_class(CLASSNAME(ref), base_type);
>> -
>> -        s = stdi_trigger_indication(_BROKER, context, type, NAMESPACE(ref));
>> -
>> -        free(type);
>> -
>> -        return s.rc == CMPI_RC_OK;
>> -}
>> -
>>   static CMPIStatus define_system(CMPIMethodMI *self,
>>                                   const CMPIContext *context,
>>                                   const CMPIResult *results,
>> @@ -2156,9 +2140,6 @@ static CMPIStatus define_system(CMPIMethodMI *self,
>>                   CMAddArg(argsout, "ResultingSystem",&result, CMPI_ref);
>>           }
>>
>> -        trigger_indication(context,
>> -                           "ComputerSystemCreatedIndication",
>> -                           reference);
>>    out:
>>           if (s.rc == CMPI_RC_OK)
>>                   rc = CIM_SVPC_RETURN_COMPLETED;
>> @@ -2261,9 +2242,6 @@ error:
>>                                         NULL,
>>                                         reference,
>> &list);
>> -                trigger_indication(context,
>> -                                   "ComputerSystemDeletedIndication",
>> -                                   reference);
>>           }
>>
>>           virDomainFree(dom);
>> @@ -2345,12 +2323,8 @@ static CMPIStatus update_system_settings(const 
>> CMPIContext *context,
>>                   connect_and_create(xml, ref,&s);
>>           }
>>
>> -        if (s.rc == CMPI_RC_OK) {
>> +        if (s.rc == CMPI_RC_OK)
>>                   set_autostart(vssd, ref, dom);
>> -                trigger_indication(context,
>> -                                   "ComputerSystemModifiedIndication",
>> -                                   ref);
>> -        }
>>
>>    out:
>>           free(xml);
>
>


-- 
Chip Vincent
Open Virtualization
IBM Linux Technology Center
cvincent at linux.vnet.ibm.com




More information about the Libvirt-cim mailing list