edid: Prune duplicates after adding modes from DDC
Multiple calls to xf86EdidMonitorSet (which can be triggered e.g. by running xrandr) would potentially keep adding the same modes, causing the Monitor->Modes list to keep growing larger and using up more memory. Fix this by calling xf86PruneDuplicateModes after adding the modes returned by xf86DDCGetModes. This makes sure there's only one instance of each unique mode in the list. v2: * Replace semicolon with {} for empty for loop (Emil Velikov) * Slightly tweak commit log to avoid minor inaccuracy about what xf86PruneDuplicateModes does Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99521 Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
This commit is contained in:
parent
4e76c27117
commit
fdc79fe72b
|
@ -1198,21 +1198,19 @@ xf86EdidMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
|
|||
if (!Monitor->nHsync || !Monitor->nVrefresh)
|
||||
DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
|
||||
|
||||
/* look for last Mode */
|
||||
Mode = Modes;
|
||||
|
||||
while (Mode->next)
|
||||
Mode = Mode->next;
|
||||
|
||||
/* add to MonPtr */
|
||||
if (Monitor->Modes) {
|
||||
Monitor->Last->next = Modes;
|
||||
Modes->prev = Monitor->Last;
|
||||
Monitor->Last = Mode;
|
||||
}
|
||||
else {
|
||||
Monitor->Modes = Modes;
|
||||
Monitor->Last = Mode;
|
||||
}
|
||||
|
||||
xf86PruneDuplicateModes(Monitor->Modes);
|
||||
|
||||
/* Update pointer to last mode */
|
||||
for (Mode = Monitor->Modes; Mode && Mode->next; Mode = Mode->next) {}
|
||||
Monitor->Last = Mode;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user