- MMS client: fixed - getNameList task can get stuck in while loop when message cannot be sent (LIB61850-347)

pull/515/head
Michael Zillgith 1 year ago
parent 58939c3209
commit 98d6be4354

@ -1975,7 +1975,8 @@ mmsClient_getNameListSingleRequestAsync(
void* parameter, void* parameter,
LinkedList nameList) LinkedList nameList)
{ {
if (getConnectionState(self) != MMS_CONNECTION_STATE_CONNECTED) { if (getConnectionState(self) != MMS_CONNECTION_STATE_CONNECTED)
{
if (mmsError) if (mmsError)
*mmsError = MMS_ERROR_CONNECTION_LOST; *mmsError = MMS_ERROR_CONNECTION_LOST;
goto exit_function; goto exit_function;
@ -1991,8 +1992,8 @@ mmsClient_getNameListSingleRequestAsync(
if (associationSpecific) if (associationSpecific)
mmsClient_createMmsGetNameListRequestAssociationSpecific(invokeId, mmsClient_createMmsGetNameListRequestAssociationSpecific(invokeId,
payload, continueAfter); payload, continueAfter);
else { else
{
if (objectClass == MMS_OBJECT_CLASS_DOMAIN) if (objectClass == MMS_OBJECT_CLASS_DOMAIN)
mmsClient_createMmsGetNameListRequestVMDspecific(invokeId, mmsClient_createMmsGetNameListRequestVMDspecific(invokeId,
payload, continueAfter); payload, continueAfter);
@ -2036,7 +2037,6 @@ getNameListHandler(uint32_t invokeId, void* parameter, MmsError mmsError, Linked
Semaphore_post(parameters->sem); Semaphore_post(parameters->sem);
} }
static LinkedList /* <char*> */ static LinkedList /* <char*> */
mmsClient_getNameList(MmsConnection self, MmsError *mmsError, mmsClient_getNameList(MmsConnection self, MmsError *mmsError,
const char* domainId, const char* domainId,
@ -2059,7 +2059,8 @@ mmsClient_getNameList(MmsConnection self, MmsError *mmsError,
mmsClient_getNameListSingleRequestAsync(self, NULL, &err, domainId, objectClass, associationSpecific, NULL, mmsClient_getNameListSingleRequestAsync(self, NULL, &err, domainId, objectClass, associationSpecific, NULL,
getNameListHandler, &parameter, NULL); getNameListHandler, &parameter, NULL);
if (err == MMS_ERROR_NONE) { if (err == MMS_ERROR_NONE)
{
Semaphore_wait(parameter.sem); Semaphore_wait(parameter.sem);
err = parameter.err; err = parameter.err;
list = parameter.nameList; list = parameter.nameList;
@ -2068,7 +2069,8 @@ mmsClient_getNameList(MmsConnection self, MmsError *mmsError,
Semaphore_destroy(parameter.sem); Semaphore_destroy(parameter.sem);
while (moreFollows) { while (moreFollows)
{
parameter.sem = Semaphore_create(1); parameter.sem = Semaphore_create(1);
char* continueAfter = NULL; char* continueAfter = NULL;
@ -2081,12 +2083,18 @@ mmsClient_getNameList(MmsConnection self, MmsError *mmsError,
mmsClient_getNameListSingleRequestAsync(self, NULL, &err, domainId, objectClass, associationSpecific, continueAfter, mmsClient_getNameListSingleRequestAsync(self, NULL, &err, domainId, objectClass, associationSpecific, continueAfter,
getNameListHandler, &parameter, list); getNameListHandler, &parameter, list);
if (err == MMS_ERROR_NONE) { if (err == MMS_ERROR_NONE)
{
Semaphore_wait(parameter.sem); Semaphore_wait(parameter.sem);
err = parameter.err; err = parameter.err;
list = parameter.nameList; list = parameter.nameList;
moreFollows = parameter.moreFollows; moreFollows = parameter.moreFollows;
} }
else
{
/* exit look when message cannot be sent */
moreFollows = false;
}
Semaphore_destroy(parameter.sem); Semaphore_destroy(parameter.sem);
} }
@ -2094,8 +2102,10 @@ mmsClient_getNameList(MmsConnection self, MmsError *mmsError,
if (mmsError) if (mmsError)
*mmsError = err; *mmsError = err;
if (err != MMS_ERROR_NONE) { if (err != MMS_ERROR_NONE)
if (list) { {
if (list)
{
LinkedList_destroy(list); LinkedList_destroy(list);
list = NULL; list = NULL;
} }
@ -2188,7 +2198,6 @@ MmsConnection_getVariableListNamesAssociationSpecificAsync(MmsConnection self, u
continueAfter, handler, parameter, NULL); continueAfter, handler, parameter, NULL);
} }
struct readNVParameters struct readNVParameters
{ {
Semaphore sem; Semaphore sem;

Loading…
Cancel
Save