dbExpand.pl outputs records in non-deterministic order
Affects | Status | Importance | Assigned to | Milestone | ||
---|---|---|---|---|---|---|
EPICS Base | Status tracked in 7.0 | |||||
7.0 |
Triaged
|
Wishlist
|
Andrew Johnson |
Bug Description
This concerns only the 7.0 branch since in 3.15 there is no dbExpand.pl.
The observed non-determinism makes it hard to compare (diff) generated db files if DB_OPT has been set in a Makefile.
The solution is simple, at the cost of making the procedure slightly less efficient:
diff --git a/modules/
index 869b485..55051df 100644
--- a/modules/
+++ b/modules/
@@ -118,8 +118,7 @@ sub OutputBreaktables {
sub OutputRecords {
my ($out, $records) = @_;
- foreach my $name (sort(keys %$records)) {
- my $rec = $records->{$name};
+ while (my ($name, $rec) = each %{$records}) {
next if $name ne $rec->name; # Alias
printf $out "record(%s, \"%s\") {\n", $rec->recordtyp
printf $out " alias(\"%s\")\n", $_
Note: other output routines inside this module are similarly non-deterministic in their output, but they are not used by dbExpand.pl.
Changed in epics-base: | |
status: | New → Triaged |
importance: | Undecided → Medium |
assignee: | nobody → Andrew Johnson (anj) |
The suggested solution makes the result deterministic but still changes the record order. Would it be preferable to keep a list of the records in the order in which they were parsed? That wouldn't be hard to do if desirable.
NB: The sense of the diff above is reversed, '-' lines normally show the existing code and '+' lines the new.