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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel