This is an automatically generated e-mail. To reply, visit: http://reviewboard-openlmi.rhcloud.com/r/351/

On May 15th, 2013, 6:36 p.m. CEST, Jan Safranek wrote:

src/indmanager/ind_manager.c (Diff revision 1)
502
    CMSetProperty(ind_inst, "SourceInstance", &new_inst, CMPI_instance);
CMSetProperty has CMPIValue* as the third argument, not CMPIInstance **.

This applies to all CMSetProperty calls below.

On May 16th, 2013, 1:56 p.m. CEST, Roman Rakus wrote:

Don't ask me why, but it works this way.
'Working' does not mean 'correct'. It works just accidentally because CMPIValue is union, having CMPIInstance* as member.

On May 15th, 2013, 6:36 p.m. CEST, Jan Safranek wrote:

src/indmanager/ind_manager.c (Diff revision 1)
621
static void *manage(void *data)
622
{
I am afraid most of CMGet* function calls in this thread will leak memory as they do not run in context of any CIM operation (which would free it upon completion). Double check with valgrind!

On May 16th, 2013, 1:56 p.m. CEST, Roman Rakus wrote:

I thought that CBAttachThread() will take care of it. But will check it.
CBAttachThread ensures that CMGet* won't fail. It won't de-allocate the copies returned from it. At least that's what I found in Pegasus implementation of CMPI.

- Jan


On May 16th, 2013, 1:59 p.m. CEST, Roman Rakus wrote:

Review request for OpenLMI Developers.
By Roman Rakus.

Updated May 16, 2013, 1:59 p.m.

Repository: openlmi-providers

Description

Indication manager

Signed-off-by: Roman Rakus <rrakus@redhat.com>

Testing

For testing purposes I used the following provider:
#include <konkret/konkret.h>
#include "LMI_AccountInstCreationIndication.h"

#include "ind_manager.h"
#include <stdbool.h>

static const CMPIBroker* _cb = NULL;

static IMManager *im = NULL;
IMError im_err = IM_ERR_OK;

static bool filter_checker(const CMPISelectExp *filter)
{
    //TODO - true checking
    return true;
}

// TODO - remove !
#include <unistd.h>
static bool spawner(void *data)
{
    //TODO - true checking
    return true;
}

// TODO - remove !
#include <unistd.h>
static bool spawner(void *data)
{
    //TODO - inotify
    sleep(10);
    return true;
}

static void LMI_AccountInstCreationIndicationInitialize()
{
    // startup indication manager
    im = im_create_manager(NULL, filter_checker, true, spawner,
                           IM_IND_CREATION, (CMPIBroker *)_cb, &im_err);
}

static CMPIStatus LMI_AccountInstCreationIndicationIndicationCleanup(
    CMPIIndicationMI* mi,
    const CMPIContext* cc,
    CMPIBoolean term)
{
    // destroy indication manager
    im_destroy_manager(im, cc, &im_err);
    CMReturn(CMPI_RC_OK);
}

static CMPIStatus LMI_AccountInstCreationIndicationAuthorizeFilter(
    CMPIIndicationMI* mi,
    const CMPIContext* cc,
    const CMPISelectExp* se,
    const char* ns,
    const CMPIObjectPath* op,
    const char* user)
{
    // verify filter
    im_verify_filter(im, se, cc, &im_err);
    CMReturn(CMPI_RC_OK);
}

static CMPIStatus LMI_AccountInstCreationIndicationMustPoll(
    CMPIIndicationMI* mi,
    const CMPIContext* cc,
    const CMPISelectExp* se,
    const char* ns, 
    const CMPIObjectPath* op)
{
  // yes, this is not supported :(
    CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
}

static CMPIStatus LMI_AccountInstCreationIndicationActivateFilter(
    CMPIIndicationMI* mi,
    const CMPIContext* cc,
    const CMPISelectExp* se,
    const char* ns,
    const CMPIObjectPath* op,
    CMPIBoolean firstActivation)
{
    // verify filter and add it via indication manager
    im_verify_filter(im, se, cc, &im_err);
    im_add_filter(im, (CMPISelectExp*)se, cc, &im_err);
    CMReturn(CMPI_RC_OK);
}

static CMPIStatus LMI_AccountInstCreationIndicationDeActivateFilter(
    CMPIIndicationMI* mi,
    const CMPIContext* cc,
    const CMPISelectExp* se,
    const char* ns,
    const CMPIObjectPath* op,
    CMPIBoolean lastActivation)
{
    // remove filter from indication manager
    im_remove_filter(im, se, cc, &im_err);
    CMReturn(CMPI_RC_OK);
}

static CMPIStatus LMI_AccountInstCreationIndicationEnableIndications(
    CMPIIndicationMI* mi, 
    const CMPIContext* cc)
{
    // start indications
    im_start_ind(im, cc, &im_err);
    CMReturn(CMPI_RC_OK);
}

static CMPIStatus LMI_AccountInstCreationIndicationDisableIndications(
    CMPIIndicationMI* mi, 
    const CMPIContext* cc)
{
    // stop indications
    im_stop_ind(im, cc, &im_err);
    CMReturn(CMPI_RC_OK);
}

CMIndicationMIStub(
    LMI_AccountInstCreationIndication,
    LMI_AccountInstCreationIndication, 
    _cb, 
    LMI_AccountInstCreationIndicationInitialize())

KONKRET_REGISTRATION(
    "root/cimv2",
    "LMI_AccountInstCreationIndication",
    "LMI_AccountInstCreationIndication",
    "indication")

Diffs

  • CMakeLists.txt (f25850e1640f52aed9f18c3bd343d41f7f5f21a4)
  • src/CMakeLists.txt (9f714d080d8541c368dedc235996e7a790930fff)
  • src/indmanager/CMakeLists.txt (PRE-CREATION)
  • src/indmanager/ind_manager.h (PRE-CREATION)
  • src/indmanager/ind_manager.c (PRE-CREATION)
  • src/indmanager/openlmiindmanager.pc.in (PRE-CREATION)

View Diff