1) Reuse existing functionality for deep clone of Imm Attr values. 2) Publish immutil internal memory management for external use --- src/amf/amfd/imm.cc | 15 ++- src/amf/amfd/imm.h | 8 +- src/ntf/ntfimcnd/ntfimcn_imm.c | 52 +-------- src/ntf/ntfimcnd/ntfimcn_imm.h | 18 ---- src/osaf/immutil/immutil.c | 190 ++++++++++++--------------------- src/osaf/immutil/immutil.h | 46 ++++++-- 6 files changed, 128 insertions(+), 201 deletions(-)
diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc index 826e90d41..b2a17a10c 100644 --- a/src/amf/amfd/imm.cc +++ b/src/amf/amfd/imm.cc @@ -206,9 +206,19 @@ done: return res; } +const size_t ImmObjCreate::INIT_MEMREF_SIZE; + +ImmObjCreate::ImmObjCreate() : + className_(NULL), + parentName_(), + attrValues_(NULL), + memRef(NULL) +{ + memRef = immutil_getMem(INIT_MEMREF_SIZE); +} // ImmObjCreate::~ImmObjCreate() { - immutil_freeSaImmAttrValuesT(attrValues_); + immutil_freeMem(memRef); delete[] className_; } @@ -1862,7 +1872,8 @@ void avd_saImmOiRtObjectCreate(const std::string &className, ajob->className_ = StrDup(className.c_str()); osafassert(ajob->className_ != nullptr); ajob->parentName_ = parentName; - ajob->attrValues_ = immutil_dupSaImmAttrValuesT(attrValues); + ajob->attrValues_ = immutil_dupSaImmAttrValuesT_array(ajob->memRef, + attrValues); Fifo::queue(ajob); TRACE_LEAVE(); diff --git a/src/amf/amfd/imm.h b/src/amf/amfd/imm.h index 99d47d313..797d7ac82 100644 --- a/src/amf/amfd/imm.h +++ b/src/amf/amfd/imm.h @@ -84,12 +84,18 @@ class ImmObjCreate : public ImmJob { SaImmClassNameT className_; std::string parentName_; SaImmAttrValuesT_2 **attrValues_; + // Memory used to deep clone SaImmAttrValuesT_2** + // memRef must be allocated by immutil_getMem() and free by immutil_freeMem() + void* memRef; - ImmObjCreate() : ImmJob(){}; + ImmObjCreate(); bool immobj_update_required(); AvdJobDequeueResultT exec(AVD_CL_CB *cb); ~ImmObjCreate(); + + private: + static const size_t INIT_MEMREF_SIZE = 512; }; // diff --git a/src/ntf/ntfimcnd/ntfimcn_imm.c b/src/ntf/ntfimcnd/ntfimcn_imm.c index 2e515e22b..deb75a072 100644 --- a/src/ntf/ntfimcnd/ntfimcn_imm.c +++ b/src/ntf/ntfimcnd/ntfimcn_imm.c @@ -37,9 +37,8 @@ #include <saImmOm.h> #include <saImmOi.h> -#include "osaf/immutil/immutil.h" -#include "ntfimcn_main.h" +#include "ntfimcn_imm.h" #include "ntfimcn_notifier.h" /* @@ -288,14 +287,6 @@ static void free_ccb_data(CcbUtilCcbData_t *ccb_data) { if (ccb_data != NULL) { if (ccb_data->userData != NULL) { osaf_extended_name_free(ccb_data->userData); - free(ccb_data->userData); - } - // Free userData in CcbUtilOperationData - struct CcbUtilOperationData* oper_data = - ccb_data->operationListHead; - for (; oper_data!= NULL; oper_data = oper_data->next) { - immutil_freeSaImmAttrValuesT((SaImmAttrValuesT_2**) - oper_data->userData); } ccbutil_deleteCcbData(ccb_data); } @@ -578,7 +569,8 @@ saImmOiCcbObjectModifyCallback(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId, struct CcbUtilOperationData *ccbOperData; ccbOperData = ccbUtilCcbData->operationListTail; SaImmAttrValuesT_2 **curAttr; - rc = get_current_attrs(objectName, attrMods, &curAttr); + rc = immutil_getCurrentAttrs(ccbUtilCcbData->memref, + objectName, attrMods, &curAttr); if (SA_AIS_OK == rc) { ccbOperData->userData = curAttr; } else { @@ -999,41 +991,3 @@ static void finalizeImmOmHandle(SaImmHandleT immOmHandle) { saf_error(ais_rc)); } } - -SaAisErrorT get_current_attrs(const SaNameT *objectName, - const SaImmAttrModificationT_2 **attrMods, - SaImmAttrValuesT_2 ***curAttr) { - TRACE_ENTER(); - SaAisErrorT rc = SA_AIS_OK; - // There is no new attribute modifications - if (attrMods == NULL) { - *curAttr = NULL; - return SA_AIS_ERR_INVALID_PARAM; - } - int len; - for (len = 0; attrMods[len] != NULL; ++len) ; - SaImmAttrNameT *attrNames = calloc((len + 1), sizeof(SaImmAttrNameT)); - if (attrNames == NULL) { - *curAttr = NULL; - return SA_AIS_ERR_NO_MEMORY; - } - for (int i = 0; i < len; ++i) { - attrNames[i] = attrMods[i]->modAttr.attrName; - } - attrNames[len] = NULL; - // Get current attributes for the given attribute names - SaImmAttrValuesT_2 **resAttr; - rc = immutil_saImmOmAccessorGet_2(ntfimcn_cb.immAccessorHandle, - objectName, attrNames, &resAttr); - if (SA_AIS_OK == rc) { - *curAttr = immutil_dupSaImmAttrValuesT( - (const SaImmAttrValuesT_2**) resAttr); - } - else { - TRACE("immutil_saImmOmAccessorGet_2 failed rc = %u", rc); - *curAttr = NULL; - } - free(attrNames); - TRACE_LEAVE2("rc = %u", rc); - return rc; -} diff --git a/src/ntf/ntfimcnd/ntfimcn_imm.h b/src/ntf/ntfimcnd/ntfimcn_imm.h index 8945d3096..1c6547d89 100644 --- a/src/ntf/ntfimcnd/ntfimcn_imm.h +++ b/src/ntf/ntfimcnd/ntfimcn_imm.h @@ -20,8 +20,6 @@ #define NTF_NTFIMCND_NTFIMCN_IMM_H_ #include "ntfimcn_main.h" -#include <stdbool.h> - #ifdef __cplusplus extern "C" { @@ -38,22 +36,6 @@ extern "C" { */ int ntfimcn_imm_init(ntfimcn_cb_t *cb); -/** - * For a given array of IMM Attribute Modifications, fetch the - * corresponding current IMM Attribute Values. The return data - * curAttr is managed by IMM unless a copy is requested. - * Deep clone method is used to copy the returned IMM Attribute Values - * - * @param *objectName[in] - * @param **attrMods[in] - * @param ***curAttr[out] - * @param copy[in] - * @return SaAisErrorT - */ -SaAisErrorT get_current_attrs(const SaNameT *objectName, - const SaImmAttrModificationT_2 **attrMods, - SaImmAttrValuesT_2 ***curAttr); - #ifdef __cplusplus } #endif diff --git a/src/osaf/immutil/immutil.c b/src/osaf/immutil/immutil.c index d2c280ca0..5c1973b3b 100644 --- a/src/osaf/immutil/immutil.c +++ b/src/osaf/immutil/immutil.c @@ -1042,6 +1042,20 @@ static void *clistMalloc(struct Chunk *clist, size_t size) return chunk->data; } +/* ---------------------------------------- + * Publishing IMM utility memory management + */ + +void* immutil_getMem(size_t size) +{ + return newChunk(NULL, size); +} + +void immutil_freeMem(void* mem) +{ + deleteClist((struct Chunk*) mem); +} + /* ---------------------------------------------------------------------- * IMM call wrappers; This wrapper interface offloads the burden to handle * return values and retries for each and every IMM-call. It makes the code @@ -2622,128 +2636,12 @@ size_t immutil_valueSize(SaImmValueTypeT type) return valueSize; } -static void _copySaImmAttrValuesT(SaImmAttrValuesT_2 **dest, - const SaImmAttrValuesT_2 *src) -{ - SaImmAttrValuesT_2 *tdest = (SaImmAttrValuesT_2*) calloc(1, - sizeof(SaImmAttrValuesT_2)); - tdest->attrName = strdup(src->attrName); - - tdest->attrValueType = src->attrValueType; - tdest->attrValuesNumber = src->attrValuesNumber; - SaUint32T count = src->attrValuesNumber; - size_t valSize = immutil_valueSize(src->attrValueType); - if (src->attrValues == NULL){ - *dest = tdest; - return; - } - tdest->attrValues = (SaImmAttrValueT*) malloc( - sizeof(SaImmAttrValueT) * count); - - for (unsigned int i = 0; i < count; ++i){ - if (src->attrValues[i] == NULL) { - tdest->attrValues[i] = NULL; - continue; - } - tdest->attrValues[i] = malloc(valSize); - switch (src->attrValueType) { - case SA_IMM_ATTR_SASTRINGT: { - *((SaStringT*) tdest->attrValues[i]) = strdup( - *((SaStringT*) src->attrValues[i])); - break; - } - case SA_IMM_ATTR_SANAMET: { - SaNameT *nameSrc = (SaNameT*) src->attrValues[i]; - SaNameT *nameDest = (SaNameT*) tdest->attrValues[i]; - osaf_extended_name_alloc( - osaf_extended_name_borrow(nameSrc), nameDest); - break; - } - case SA_IMM_ATTR_SAANYT: { - SaAnyT *anySrc = (SaAnyT*) src->attrValues[i]; - SaAnyT *anyDest = (SaAnyT*) tdest->attrValues[i]; - anyDest->bufferSize = anySrc->bufferSize; - if (anyDest->bufferSize) { - anyDest->bufferAddr = - (SaUint8T*) malloc(anyDest->bufferSize); - memcpy(anyDest->bufferAddr, - anySrc->bufferAddr, anyDest->bufferSize); - } else { - anyDest->bufferAddr = NULL; - } - break; - } - default: - memcpy(tdest->attrValues[i], - src->attrValues[i], valSize); - break; - } - } - *dest = tdest; -} - -SaImmAttrValuesT_2** immutil_dupSaImmAttrValuesT( +SaImmAttrValuesT_2** immutil_dupSaImmAttrValuesT_array(void* memRef, const SaImmAttrValuesT_2 **src) { - // Return if there is no source - if (src == NULL) { - TRACE("src is null"); - return NULL; - } - // Return if the source is just an array of NULL - int len = 0; - while (src[len] != NULL) - ++len; - if (!len) { - TRACE("src length is null"); - return NULL; - } - SaImmAttrValuesT_2 **attr = - (SaImmAttrValuesT_2 **)malloc( - (len + 1) * sizeof(SaImmAttrValuesT_2*)); - if (attr == NULL) { - TRACE("Failed to allocate memory"); - return NULL; - } - // Deep clone the source to destination - for (int i = 0; i < len; ++i) { - _copySaImmAttrValuesT(&attr[i], src[i]); - } - attr[len] = NULL; - return attr; -} - -void immutil_freeSaImmAttrValuesT(SaImmAttrValuesT_2 **attrs) -{ - if (attrs == NULL) - return; - SaImmAttrValuesT_2 *attr; - SaImmAttrValueT value; - for (int i = 0; (attr = attrs[i]) != NULL; ++i) { - free(attr->attrName); - if (attr->attrValues == NULL) { - continue; - } - for (unsigned int j = 0; j < attr->attrValuesNumber; ++j) { - value = attr->attrValues[j]; - if (value == NULL) { - continue; - } - if (attr->attrValueType == SA_IMM_ATTR_SASTRINGT) { - free(*((SaStringT*) value)); - } - else if (attr->attrValueType == SA_IMM_ATTR_SANAMET) { - osaf_extended_name_free((SaNameT*) value); - } - else if (attr->attrValueType == SA_IMM_ATTR_SAANYT) { - free(((SaAnyT*) value)->bufferAddr); - } - free(value); - } - free(attr->attrValues); - free(attr); - } - free(attrs); + return (SaImmAttrValuesT_2**) dupSaImmAttrValuesT_array( + (struct Chunk*) memRef, + src); } const SaImmAttrValuesT_2* immutil_findAttrByName( @@ -2762,3 +2660,55 @@ const SaImmAttrValuesT_2* immutil_findAttrByName( } return result; } + +SaAisErrorT immutil_getCurrentAttrs( + void* memRef, + const SaNameT *objectName, + const SaImmAttrModificationT_2 **attrMods, + SaImmAttrValuesT_2 ***curAttr) +{ + SaAisErrorT rc = SA_AIS_OK; + *curAttr = NULL; + SaImmAccessorHandleT accessorHandle; + if (attrMods == NULL) { + return SA_AIS_ERR_INVALID_PARAM; + } + SaImmHandleT omHandle; + SaVersionT localVer = immVersion; + if ((rc = immutil_saImmOmInitialize(&omHandle, NULL, &localVer)) != + SA_AIS_OK) { + return rc; + } + if ((rc = immutil_saImmOmAccessorInitialize(omHandle, &accessorHandle)) + != SA_AIS_OK) { + (void)immutil_saImmOmFinalize(omHandle); + return rc; + } + int len; + for (len = 0; attrMods[len] != NULL; ++len) ; + SaImmAttrNameT *attrNames = clistMalloc(memRef, + (len + 1) * sizeof(SaImmAttrNameT)); + if (attrNames == NULL) { + rc = SA_AIS_ERR_NO_MEMORY; + goto done; + } + for (int i = 0; i < len; ++i) { + attrNames[i] = attrMods[i]->modAttr.attrName; + } + attrNames[len] = NULL; + SaImmAttrValuesT_2 **resAttr; + rc = immutil_saImmOmAccessorGet_2(accessorHandle, + objectName, attrNames, &resAttr); + if (SA_AIS_OK == rc) { + *curAttr = (SaImmAttrValuesT_2**) + immutil_dupSaImmAttrValuesT_array(memRef, + (const SaImmAttrValuesT_2**) resAttr); + } + else { + *curAttr = NULL; + } +done: + (void)immutil_saImmOmAccessorFinalize(accessorHandle); + (void)immutil_saImmOmFinalize(omHandle); + return rc; +} diff --git a/src/osaf/immutil/immutil.h b/src/osaf/immutil/immutil.h index 7528d8203..f659fb1ce 100644 --- a/src/osaf/immutil/immutil.h +++ b/src/osaf/immutil/immutil.h @@ -190,7 +190,22 @@ EXTERN_C CcbUtilOperationData_t *ccbutil_getCcbOpDataByDN(SaImmOiCcbIdT id, * exported in a common library. */ /*@{*/ - +/** + * Allocate memory managed by ImmHelpUtils + * + * @param size[in] + * + * @return void* + */ +EXTERN_C void* immutil_getMem(size_t size); +/** + * Deallocate memory managed by ImmHelpUtils + * + * @param memRef[in] + * + * @return void* + */ +EXTERN_C void immutil_freeMem(void* memRef); /** * Get IMM Attribute Value size base on type * @@ -198,23 +213,32 @@ EXTERN_C CcbUtilOperationData_t *ccbutil_getCcbOpDataByDN(SaImmOiCcbIdT id, * @return size_t */ EXTERN_C size_t immutil_valueSize(SaImmValueTypeT type); - /** - * Deep clone IMM Attribute Values array + * For a given array of IMM Attribute Modifications, fetch the + * corresponding current IMM Attribute Values. The return data + * Deep clone method is used to copy the returned IMM Attribute Values * - * @param **src[in] - * @return SaImmAttrValuesT_2** + * @param *memRef[in] + * @param *objectName[in] + * @param **attrMods[in] + * @param ***curAttr[out] + * @param copy[in] + * @return SaAisErrorT */ -EXTERN_C SaImmAttrValuesT_2** immutil_dupSaImmAttrValuesT( - const SaImmAttrValuesT_2 **src); +EXTERN_C SaAisErrorT immutil_getCurrentAttrs(void* memRef, + const SaNameT *objectName, const SaImmAttrModificationT_2 **attrMods, + SaImmAttrValuesT_2 ***curAttr); /** - * Deallocate memory used for deep cloning IMM Attribute Values + * Deep clone IMM Attribute Values array. The memory reference memRef must be + * obtained by immutil_getMem() * - * @param **attrs[in] - * @return void + * @param *memRef[in] + * @param **src[in] + * @return SaImmAttrValuesT_2** */ -EXTERN_C void immutil_freeSaImmAttrValuesT(SaImmAttrValuesT_2 **attrs); +EXTERN_C SaImmAttrValuesT_2** immutil_dupSaImmAttrValuesT_array(void* memRef, + const SaImmAttrValuesT_2 **src); /** * Find attribute values from the given attribute name -- 2.25.0 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel