Skip to content

Commit

Permalink
remove all delete[] from interface setup (eclipse-4diac#285)
Browse files Browse the repository at this point in the history
* remove all delete[] from interface setup
* remove event types spec from gen_e_mux
  • Loading branch information
cochicde authored Dec 2, 2024
1 parent db946af commit 0a41175
Show file tree
Hide file tree
Showing 25 changed files with 182 additions and 226 deletions.
4 changes: 0 additions & 4 deletions src/core/cominfra/basecommfb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,6 @@ CBaseCommFB::CBaseCommFB(const CStringDictionary::TStringId paInstanceNameId, fo

CBaseCommFB::~CBaseCommFB() {
closeConnection();
delete[](getFBInterfaceSpec().mDINames);
delete[](getFBInterfaceSpec().mDIDataTypeNames);
delete[](getFBInterfaceSpec().mDONames);
delete[](getFBInterfaceSpec().mDODataTypeNames);
}

EMGMResponse CBaseCommFB::changeExecutionState(EMGMCommandType paCommand) {
Expand Down
58 changes: 26 additions & 32 deletions src/core/cominfra/commfb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,69 +212,63 @@ bool CCommFB::createInterfaceSpec(const char* paConfigString, SFBInterfaceSpec&
return true;
}

void CCommFB::configureDIs(const char* paDIConfigString, SFBInterfaceSpec& paInterfaceSpec) const {
CStringDictionary::TStringId* diDataTypeNames;
CStringDictionary::TStringId* diNames;

void CCommFB::configureDIs(const char* paDIConfigString, SFBInterfaceSpec& paInterfaceSpec) {
paInterfaceSpec.mNumDIs = 2;

if (forte::com_infra::e_DataInputs == (forte::com_infra::e_DataInputs & mCommServiceType)) {
//TODO: Check range of sParamA
paInterfaceSpec.mNumDIs = paInterfaceSpec.mNumDIs +
static_cast<TPortId>(forte::core::util::strtol(paDIConfigString, nullptr, 10));
diDataTypeNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDIs];
diNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDIs];
mDiDataTypeNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDIs);
mDiNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDIs);

generateGenericDataPointArrays("SD_", &(diDataTypeNames[2]), &(diNames[2]), paInterfaceSpec.mNumDIs - 2);
generateGenericDataPointArrays("SD_", &(mDiDataTypeNames[2]), &(mDiNames[2]), paInterfaceSpec.mNumDIs - 2);
}
else {
diDataTypeNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDIs];
diNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDIs];
mDiDataTypeNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDIs);
mDiNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDIs);
}
paInterfaceSpec.mDIDataTypeNames = diDataTypeNames;
paInterfaceSpec.mDINames = diNames;
paInterfaceSpec.mDIDataTypeNames = mDiDataTypeNames.get();
paInterfaceSpec.mDINames = mDiNames.get();

diDataTypeNames[0] = g_nStringIdBOOL;
diNames[0] = g_nStringIdQI;
mDiDataTypeNames[0] = g_nStringIdBOOL;
mDiNames[0] = g_nStringIdQI;
#ifdef FORTE_USE_WSTRING_DATATYPE
diDataTypeNames[1] = g_nStringIdWSTRING;
mDiDataTypeNames[1] = g_nStringIdWSTRING;
#else //FORTE_USE_WSTRING_DATATYPE
diDataTypeNames[1] = g_nStringIdSTRING;
mDiDataTypeNames[1] = g_nStringIdSTRING;
#endif //FORTE_USE_WSTRING_DATATYPE
diNames[1] = g_nStringIdID;
mDiNames[1] = g_nStringIdID;
}

void CCommFB::configureDOs(const char* paDOConfigString, SFBInterfaceSpec& paInterfaceSpec) const {
CStringDictionary::TStringId* doDataTypeNames;
CStringDictionary::TStringId* doNames;

void CCommFB::configureDOs(const char* paDOConfigString, SFBInterfaceSpec& paInterfaceSpec) {
paInterfaceSpec.mNumDOs = 2;

if(forte::com_infra::e_DataOutputs == (forte::com_infra::e_DataOutputs & mCommServiceType)){
//TODO: Check range of sParamA
paInterfaceSpec.mNumDOs = paInterfaceSpec.mNumDOs +
static_cast<TPortId>(forte::core::util::strtol(paDOConfigString, nullptr, 10));
doDataTypeNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDOs];
doNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDOs];
mDoDataTypeNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDOs);
mDoNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDOs);

generateGenericDataPointArrays("RD_", &(doDataTypeNames[2]), &(doNames[2]), paInterfaceSpec.mNumDOs - 2);
generateGenericDataPointArrays("RD_", &(mDoDataTypeNames[2]), &(mDoNames[2]), paInterfaceSpec.mNumDOs - 2);
}
else{
doDataTypeNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDOs];
doNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDOs];
mDoDataTypeNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDOs);
mDoNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDOs);
}

paInterfaceSpec.mDONames = doNames;
paInterfaceSpec.mDODataTypeNames = doDataTypeNames;
paInterfaceSpec.mDONames = mDoNames.get();
paInterfaceSpec.mDODataTypeNames = mDoDataTypeNames.get();

doDataTypeNames[0] = g_nStringIdBOOL;
doNames[0] = g_nStringIdQO;
mDoDataTypeNames[0] = g_nStringIdBOOL;
mDoNames[0] = g_nStringIdQO;
#ifdef FORTE_USE_WSTRING_DATATYPE
doDataTypeNames[1] = g_nStringIdWSTRING;
mDoDataTypeNames[1] = g_nStringIdWSTRING;
#else
doDataTypeNames[1] = g_nStringIdSTRING;
mDoDataTypeNames[1] = g_nStringIdSTRING;
#endif
doNames[1] = g_nStringIdSTATUS;
mDoNames[1] = g_nStringIdSTATUS;

}

Expand Down
12 changes: 9 additions & 3 deletions src/core/cominfra/commfb.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,16 @@ namespace forte {
static const CStringDictionary::TStringId scmEventInputTypeIds[];
static const CStringDictionary::TStringId scmEventOutputTypeIds[];

bool createInterfaceSpec(const char* paConfigString, SFBInterfaceSpec& paInterfaceSpec) override;
std::unique_ptr<CStringDictionary::TStringId[]> mDiDataTypeNames;
std::unique_ptr<CStringDictionary::TStringId[]> mDiNames;
std::unique_ptr<CStringDictionary::TStringId[]> mDoDataTypeNames;
std::unique_ptr<CStringDictionary::TStringId[]> mDoNames;

bool createInterfaceSpec(const char* paConfigString, SFBInterfaceSpec& paInterfaceSpec) override;

void configureDIs(const char* paDIConfigString, SFBInterfaceSpec& paInterfaceSpec);
void configureDOs(const char* paDOConfigString, SFBInterfaceSpec& paInterfaceSpec);

void configureDIs(const char* paDIConfigString, SFBInterfaceSpec& paInterfaceSpec) const;
void configureDOs(const char* paDOConfigString, SFBInterfaceSpec& paInterfaceSpec) const;
};

}
Expand Down
15 changes: 4 additions & 11 deletions src/modules/IEC61131-3/Arithmetic/GEN_FORTE_F_MOVE_fbt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ GEN_FORTE_F_MOVE::GEN_FORTE_F_MOVE(const CStringDictionary::TStringId paInstance
CGenFunctionBlock<CFunctionBlock>(paContainer, paInstanceNameId) {
}

GEN_FORTE_F_MOVE::~GEN_FORTE_F_MOVE(){
delete[](getGenInterfaceSpec().mDIDataTypeNames);
delete[](getGenInterfaceSpec().mDODataTypeNames);
}

void GEN_FORTE_F_MOVE::executeEvent(TEventID paEIID, CEventChainExecutionThread *const paECET) {
switch(paEIID) {
case scmEventREQID:
Expand Down Expand Up @@ -77,10 +72,8 @@ bool GEN_FORTE_F_MOVE::createInterfaceSpec(const char *paConfigString, SFBInterf
}
}

CStringDictionary::TStringId *diDataTypeNames = new CStringDictionary::TStringId[1];
diDataTypeNames[0] = poToCreate->getTypeNameId();
CStringDictionary::TStringId *doDataTypeNames = new CStringDictionary::TStringId[1];
doDataTypeNames[0] = poToCreate->getTypeNameId();
mDiDataTypeNames[0] = poToCreate->getTypeNameId();
mDoDataTypeNames[0] = poToCreate->getTypeNameId();

paInterfaceSpec.mNumEIs = 1;
paInterfaceSpec.mEINames = scmEventInputNames;
Expand All @@ -92,10 +85,10 @@ bool GEN_FORTE_F_MOVE::createInterfaceSpec(const char *paConfigString, SFBInterf
paInterfaceSpec.mEOWithIndexes = scmEOWithIndexes;
paInterfaceSpec.mNumDIs = 1;
paInterfaceSpec.mDINames = scmDataInputNames;
paInterfaceSpec.mDIDataTypeNames = diDataTypeNames;
paInterfaceSpec.mDIDataTypeNames = mDiDataTypeNames.data();
paInterfaceSpec.mNumDOs = 1;
paInterfaceSpec.mDONames = scmDataOutputNames;
paInterfaceSpec.mDODataTypeNames = doDataTypeNames;
paInterfaceSpec.mDODataTypeNames = mDoDataTypeNames.data();

return true;
}
Expand Down
7 changes: 5 additions & 2 deletions src/modules/IEC61131-3/Arithmetic/GEN_FORTE_F_MOVE_fbt.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,18 @@
#include "forte_array_fixed.h"
#include "forte_array_variable.h"

#include <array>

class GEN_FORTE_F_MOVE : public CGenFunctionBlock<CFunctionBlock> {
DECLARE_GENERIC_FIRMWARE_FB(GEN_FORTE_F_MOVE)

private:
static const CStringDictionary::TStringId scmDataInputNames[];
std::array<CStringDictionary::TStringId,1> mDiDataTypeNames;

static const CStringDictionary::TStringId scmDataOutputNames[];

std::array<CStringDictionary::TStringId,1> mDoDataTypeNames;

static const TEventID scmEventREQID = 0;

static const TDataIOID scmEIWith[];
Expand All @@ -56,7 +59,7 @@ class GEN_FORTE_F_MOVE : public CGenFunctionBlock<CFunctionBlock> {

public:
GEN_FORTE_F_MOVE(const CStringDictionary::TStringId paInstanceNameId, forte::core::CFBContainer &paContainer);
~GEN_FORTE_F_MOVE() override;
~GEN_FORTE_F_MOVE() override = default;

CIEC_ANY& var_IN() {
return *static_cast<CIEC_ANY*>(getDI(0));
Expand Down
15 changes: 5 additions & 10 deletions src/modules/IEC61131-3/BitwiseOperators/genbitbase_fbt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,7 @@ const CStringDictionary::TStringId CGenBitBase::scmEventInputNames[] = {g_nStrin
const CStringDictionary::TStringId CGenBitBase::scmEventOutputNames[] = { g_nStringIdCNF };

CGenBitBase::CGenBitBase(const CStringDictionary::TStringId paInstanceNameId, forte::core::CFBContainer &paContainer) :
CGenFunctionBlock<CFunctionBlock>(paContainer, paInstanceNameId), mDataInputNames(nullptr), mDataInputTypeIds(nullptr) {
}

CGenBitBase::~CGenBitBase(){
delete[] mDataInputNames;
delete[] mDataInputTypeIds;
CGenFunctionBlock<CFunctionBlock>(paContainer, paInstanceNameId) {
}

void CGenBitBase::readInputData(TEventID) {
Expand Down Expand Up @@ -73,8 +68,8 @@ bool CGenBitBase::createInterfaceSpec(const char *paConfigString, SFBInterfaceSp
if (paInterfaceSpec.mNumDIs < CFunctionBlock::scmMaxInterfaceEvents) {

//create the data inputs
mDataInputNames = new CStringDictionary::TStringId[paInterfaceSpec.mNumDIs];
mDataInputTypeIds = new CStringDictionary::TStringId[paInterfaceSpec.mNumDIs];
mDataInputNames = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDIs);
mDataInputTypeIds = std::make_unique<CStringDictionary::TStringId[]>(paInterfaceSpec.mNumDIs);

char diNames[cgIdentifierLength] = { "IN" };

Expand All @@ -89,8 +84,8 @@ bool CGenBitBase::createInterfaceSpec(const char *paConfigString, SFBInterfaceSp
paInterfaceSpec.mEINames = scmEventInputNames;
paInterfaceSpec.mNumEOs = 1;
paInterfaceSpec.mEONames = scmEventOutputNames;
paInterfaceSpec.mDINames = mDataInputNames;
paInterfaceSpec.mDIDataTypeNames = mDataInputTypeIds;
paInterfaceSpec.mDINames = mDataInputNames.get();
paInterfaceSpec.mDIDataTypeNames = mDataInputTypeIds.get();
paInterfaceSpec.mNumDOs = 1;
paInterfaceSpec.mDONames = scmDataOutputNames;
paInterfaceSpec.mDODataTypeNames = scmDataOutputTypeIds;
Expand Down
8 changes: 5 additions & 3 deletions src/modules/IEC61131-3/BitwiseOperators/genbitbase_fbt.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
#include "../genfb.h"
#include "forte_any_bit_variant.h"

#include <memory>

class CGenBitBase : public CGenFunctionBlock<CFunctionBlock> {

protected:
CGenBitBase(const CStringDictionary::TStringId paInstanceNameId, forte::core::CFBContainer &paContainer);
~CGenBitBase() override;
~CGenBitBase() override = default;

CIEC_ANY_BIT_VARIANT& var_IN(size_t paIndex) {
return *static_cast<CIEC_ANY_BIT_VARIANT *>(getDI(paIndex));
Expand All @@ -38,8 +40,8 @@ class CGenBitBase : public CGenFunctionBlock<CFunctionBlock> {
static const TEventID scmEventCNFID = 0;

private:
CStringDictionary::TStringId *mDataInputNames;
CStringDictionary::TStringId *mDataInputTypeIds;
std::unique_ptr<CStringDictionary::TStringId[]> mDataInputNames;
std::unique_ptr<CStringDictionary::TStringId[]> mDataInputTypeIds;

static const CStringDictionary::TStringId scmDataOutputNames[];
static const CStringDictionary::TStringId scmDataOutputTypeIds[];
Expand Down
24 changes: 10 additions & 14 deletions src/modules/convert/GEN_STRUCT_DEMUX_fbt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,6 @@ GEN_STRUCT_DEMUX::GEN_STRUCT_DEMUX(const CStringDictionary::TStringId paInstance
CGenFunctionBlock<CFunctionBlock>(paContainer, paInstanceNameId){
}

GEN_STRUCT_DEMUX::~GEN_STRUCT_DEMUX() {
delete[] (getGenInterfaceSpec().mDIDataTypeNames);
delete[] (getGenInterfaceSpec().mDONames);
delete[] (getGenInterfaceSpec().mDODataTypeNames);
}

void GEN_STRUCT_DEMUX::readInputData(TEventID) {
readData(0, *mDIs[0], mDIConns[0]);
}
Expand Down Expand Up @@ -93,9 +87,11 @@ bool GEN_STRUCT_DEMUX::createInterfaceSpec(const char *paConfigString, SFBInterf

size_t structSize = structInstance->getStructSize();
if(structSize != 0 && structSize < cgInvalidPortId) { //the structure size must be non zero and less than cgInvalidPortId (maximum number of data outputs)
CStringDictionary::TStringId *doDataTypeNames = new CStringDictionary::TStringId[GEN_STRUCT_MUX::calcStructTypeNameSize(*structInstance)];
CStringDictionary::TStringId *doNames = new CStringDictionary::TStringId[structSize];
CStringDictionary::TStringId *diDataTypeNames = new CStringDictionary::TStringId[1];

mDoDataTypeNames = std::make_unique<CStringDictionary::TStringId[]>(GEN_STRUCT_MUX::calcStructTypeNameSize(*structInstance));
mDoNames = std::make_unique<CStringDictionary::TStringId[]>(structSize);

mDiDataTypeNames[0] = structTypeNameId;

paInterfaceSpec.mNumEIs = 1;
paInterfaceSpec.mEINames = scmEventInputNames;
Expand All @@ -105,15 +101,15 @@ bool GEN_STRUCT_DEMUX::createInterfaceSpec(const char *paConfigString, SFBInterf
paInterfaceSpec.mEOTypeNames = scmEventOutputTypeIds;
paInterfaceSpec.mNumDIs = 1;
paInterfaceSpec.mDINames = scmDataInputNames;
paInterfaceSpec.mDIDataTypeNames = diDataTypeNames;
paInterfaceSpec.mDIDataTypeNames = mDiDataTypeNames.data();
paInterfaceSpec.mNumDOs = structSize;
paInterfaceSpec.mDONames = doNames;
paInterfaceSpec.mDODataTypeNames = doDataTypeNames;
diDataTypeNames[0] = structTypeNameId;
paInterfaceSpec.mDONames = mDoNames.get();
paInterfaceSpec.mDODataTypeNames = mDoDataTypeNames.get();

auto doDataTypeNames = mDoDataTypeNames.get();
for(size_t i = 0; i < structSize; ++i) {
const CIEC_ANY &member = *structInstance->getMember(i);
doNames[i] = structInstance->elementNames()[i];
mDoNames[i] = structInstance->elementNames()[i];
fillDataPointSpec(member, doDataTypeNames);
}
retval = true;
Expand Down
10 changes: 9 additions & 1 deletion src/modules/convert/GEN_STRUCT_DEMUX_fbt.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@
#include <genfb.h>
#include <stdio.h>

#include <memory>
#include <array>

class GEN_STRUCT_DEMUX : public CGenFunctionBlock<CFunctionBlock> {
DECLARE_GENERIC_FIRMWARE_FB(GEN_STRUCT_DEMUX)

private:

std::unique_ptr<CStringDictionary::TStringId[]> mDoDataTypeNames;
std::unique_ptr<CStringDictionary::TStringId[]> mDoNames;

static const CStringDictionary::TStringId scmDataInputNames[];
std::array<CStringDictionary::TStringId, 1> mDiDataTypeNames;

static const TEventID scmEventREQID = 0;
static const CStringDictionary::TStringId scmEventInputNames[];
Expand Down Expand Up @@ -51,7 +59,7 @@ class GEN_STRUCT_DEMUX : public CGenFunctionBlock<CFunctionBlock> {

GEN_STRUCT_DEMUX(const GEN_STRUCT_DEMUX &paOther) = delete;
GEN_STRUCT_DEMUX(const CStringDictionary::TStringId paInstanceNameId, forte::core::CFBContainer &paContainer);
~GEN_STRUCT_DEMUX() override;
~GEN_STRUCT_DEMUX() override = default;

};

Expand Down
24 changes: 9 additions & 15 deletions src/modules/convert/GEN_STRUCT_MUX_fbt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,6 @@ void GEN_STRUCT_MUX::copyStructValuesToInputs() {
}
}

GEN_STRUCT_MUX::~GEN_STRUCT_MUX(){
delete[](getGenInterfaceSpec().mDINames);
delete[](getGenInterfaceSpec().mDIDataTypeNames);
delete[](getGenInterfaceSpec().mDODataTypeNames);
}

void GEN_STRUCT_MUX::readInputData(TEventID) {
for(TPortId i = 0; i < getFBInterfaceSpec().mNumDIs; ++i) {
readData(i, *mDIs[i], mDIConns[i]);
Expand Down Expand Up @@ -106,10 +100,11 @@ bool GEN_STRUCT_MUX::createInterfaceSpec(const char *paConfigString, SFBInterfac
CStringDictionary::getInstance().get(structTypeNameId), cgInvalidPortId);
return false;
}

mDiDataTypeNames = std::make_unique<CStringDictionary::TStringId[]>(calcStructTypeNameSize(*structInstance));
mDiNames = std::make_unique<CStringDictionary::TStringId[]>(structSize);

auto* diDataTypeNames = new CStringDictionary::TStringId[calcStructTypeNameSize(*structInstance)];
auto* diNames = new CStringDictionary::TStringId[structSize];
auto* doDataTypeNames = new CStringDictionary::TStringId[1];
mDoDataTypeNames[0] = structTypeNameId;

paInterfaceSpec.mNumEIs = 1;
paInterfaceSpec.mEINames = scmEventInputNames;
Expand All @@ -118,19 +113,18 @@ bool GEN_STRUCT_MUX::createInterfaceSpec(const char *paConfigString, SFBInterfac
paInterfaceSpec.mEONames = scmEventOutputNames;
paInterfaceSpec.mEOTypeNames = scmEventOutputTypeIds;
paInterfaceSpec.mNumDIs = structSize;
paInterfaceSpec.mDINames = diNames;
paInterfaceSpec.mDIDataTypeNames = diDataTypeNames;
paInterfaceSpec.mDINames = mDiNames.get();
paInterfaceSpec.mDIDataTypeNames = mDiDataTypeNames.get();
paInterfaceSpec.mNumDOs = 1;
paInterfaceSpec.mDONames = scmDataOutputNames;
paInterfaceSpec.mDODataTypeNames = doDataTypeNames;
doDataTypeNames[0] = structTypeNameId;
paInterfaceSpec.mDODataTypeNames = mDoDataTypeNames.data();

auto diDataTypeNames = mDiDataTypeNames.get();
for(decltype(paInterfaceSpec.mNumDIs) i = 0; i < paInterfaceSpec.mNumDIs; i++) {
const auto& member = *structInstance->getMember(i);
diNames[i] = structInstance->elementNames()[i];
mDiNames[i] = structInstance->elementNames()[i];
fillDataPointSpec(member, diDataTypeNames);
}

return true;
}

Expand Down
Loading

0 comments on commit 0a41175

Please sign in to comment.