- IEC 61850 server: fixed potential deadlock in report processing

pull/90/head
Michael Zillgith 7 years ago
parent f68e97b7a1
commit 4a135fa252

@ -475,8 +475,12 @@ sendReport(ReportControl* self, bool isIntegrity, bool isGI)
for (i = 0; i < self->dataSet->elementCount; i++) for (i = 0; i < self->dataSet->elementCount; i++)
self->inclusionFlags[i] = REPORT_CONTROL_NONE; self->inclusionFlags[i] = REPORT_CONTROL_NONE;
ReportControl_unlockNotify(self);
MmsServerConnection_sendInformationReportVMDSpecific(self->clientConnection, "RPT", reportElements, false); MmsServerConnection_sendInformationReportVMDSpecific(self->clientConnection, "RPT", reportElements, false);
ReportControl_lockNotify(self);
/* Increase sequence number */ /* Increase sequence number */
self->sqNum++; self->sqNum++;
@ -2393,8 +2397,12 @@ sendNextReportEntry(ReportControl* self)
} }
} }
ReportControl_unlockNotify(self);
MmsServerConnection_sendInformationReportVMDSpecific(self->clientConnection, "RPT", (LinkedList) reportElements, false); MmsServerConnection_sendInformationReportVMDSpecific(self->clientConnection, "RPT", (LinkedList) reportElements, false);
ReportControl_lockNotify(self);
/* Increase sequence number */ /* Increase sequence number */
self->sqNum++; self->sqNum++;
MmsValue_setUint32(sqNum, self->sqNum); MmsValue_setUint32(sqNum, self->sqNum);
@ -2455,12 +2463,13 @@ processEventsForReport(ReportControl* rc, uint64_t currentTimeInMs)
/* send current events in event buffer before GI report */ /* send current events in event buffer before GI report */
if (rc->triggered) { if (rc->triggered) {
rc->triggered = false;
if (rc->buffered) if (rc->buffered)
enqueueReport(rc, false, false, currentTimeInMs); enqueueReport(rc, false, false, currentTimeInMs);
else else
sendReport(rc, false, false); sendReport(rc, false, false);
rc->triggered = false;
} }
if (rc->buffered) if (rc->buffered)

Loading…
Cancel
Save