Merge "logd: correct duplicate message state machine"

This commit is contained in:
Treehugger Robot 2016-12-19 23:43:22 +00:00 committed by Gerrit Code Review
commit 9fa0215e15
1 changed files with 70 additions and 6 deletions

View File

@ -206,6 +206,68 @@ int LogBuffer::log(log_id_t log_id, log_time realtime,
if (currentLast) {
LogBufferElement *dropped = droppedElements[log_id];
unsigned short count = dropped ? dropped->getDropped() : 0;
//
// State Init
// incoming:
// dropped = NULL
// currentLast = NULL;
// elem = incoming message
// outgoing:
// dropped = NULL -> State 0
// currentLast = copy of elem
// log elem
// State 0
// incoming:
// count = 0
// dropped = NULL
// currentLast = copy of last message
// elem = incoming message
// outgoing: (if *elem == *currentLast)
// dropped = copy of first identical message -> State 1
// currentLast = reference to elem
// break: (if *elem != *currentLast)
// dropped = NULL -> State 0
// delete copy of last message (incoming currentLast)
// currentLast = copy of elem
// log elem
// State 1
// incoming:
// count = 0
// dropped = copy of first identical message
// currentLast = reference to last held-back incoming
// message
// elem = incoming message
// outgoing: (if *elem == *currentLast)
// delete copy of first identical message (dropped)
// dropped = reference to last held-back incoming
// message set to chatty count of 1 -> State 2
// currentLast = reference to elem
// break:
// delete dropped
// dropped = NULL -> State 0
// log reference to last held-back (currentLast)
// currentLast = copy of elem
// log elem
// State 2
// incoming:
// count = chatty count
// dropped = chatty message holding count
// currentLast = reference to last held-back incoming
// message.
// dropped = chatty message holding count
// elem = incoming message
// outgoing: (if *elem == *currentLast)
// delete chatty message holding count
// dropped = reference to last held-back incoming
// message, set to chatty count + 1
// currentLast = reference to elem
// break:
// log dropped (chatty message)
// dropped = NULL -> State 0
// log reference to last held-back (currentLast)
// currentLast = copy of elem
// log elem
//
if (identical(elem, currentLast)) {
if (dropped) {
if (count == USHRT_MAX) {
@ -226,13 +288,15 @@ int LogBuffer::log(log_id_t log_id, log_time realtime,
pthread_mutex_unlock(&mLogElementsLock);
return len;
}
if (dropped) {
log(dropped);
if (dropped) { // State 1 or 2
if (count) { // State 2
log(dropped); // report chatty
} else { // State 1
delete dropped;
}
droppedElements[log_id] = NULL;
}
if (count) {
log(currentLast);
} else {
log(currentLast); // report last message in the series
} else { // State 0
delete currentLast;
}
}