Changeset 9084bba in subsurface


Ignore:
Timestamp:
Apr 30, 2017, 12:38:09 PM (4 weeks ago)
Author:
Dirk Hohndel <dirk@…>
Branches:
master
Children:
fff253e
Parents:
95bff0d
git-author:
Linus Torvalds <torvalds@…> (04/29/17 16:21:41)
git-committer:
Dirk Hohndel <dirk@…> (04/30/17 12:38:09)
Message:

Fix event merging when interleaving dives

The core to avoid adding redundant gas switch events was completely
buggered, and caused the result list to be corrupted if it ever
triggered. This should fix it.

Fixes: b5de08b7 ("No gas change event on merging dives with same gas")
Reported-by: Jan Mulder <jlmulder@…>
Cc: Miika Turkia <miika.turkia@…>
Cc: Dirk Hohndel <dirk@…>
Signed-off-by: Linus Torvalds <torvalds@…>
Signed-off-by: Dirk Hohndel <dirk@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/dive.c

    rb368ecd r9084bba  
    17841784        struct event *a, *b;
    17851785        struct event **p = &res->events;
     1786        struct event *last_gas = NULL;
    17861787
    17871788        /* Always use positive offsets */
     
    18051806        while (a || b) {
    18061807                int s;
     1808                struct event *pick;
     1809
    18071810                if (!b) {
    18081811                        *p = a;
     
    18151818                s = sort_event(a, b);
    18161819
    1817                 /* No gas change event when continuing with same gas */
    1818                 if (same_gas(a, b)) {
    1819                         if (s > 0) {
    1820                                 p = &b->next;
    1821                                 b = b->next;
    1822                         } else {
    1823                                 p = &a->next;
    1824                                 a = a->next;
    1825                         }
     1820                /* Identical events? Just skip one of them (we pick a) */
     1821                if (!s) {
     1822                        a = a->next;
    18261823                        continue;
    18271824                }
    18281825
    1829                 /* Pick b */
    1830                 if (s > 0) {
    1831                         *p = b;
    1832                         p = &b->next;
     1826                /* Otherwise, pick the one that sorts first */
     1827                if (s < 0) {
     1828                        pick = a;
     1829                        a = a->next;
     1830                } else {
     1831                        pick = b;
    18331832                        b = b->next;
    1834                         continue;
    1835                 }
    1836                 /* Pick 'a' or neither */
    1837                 if (s < 0) {
    1838                         *p = a;
    1839                         p = &a->next;
    1840                 }
    1841                 a = a->next;
    1842                 continue;
     1833                }
     1834
     1835                /*
     1836                 * If that's a gas-change that matches the previous
     1837                 * gas change, we'll just skip it
     1838                 */
     1839                if (event_is_gaschange(pick)) {
     1840                        if (last_gas && same_gas(pick, last_gas))
     1841                                continue;
     1842                        last_gas = pick;
     1843                }
     1844
     1845                /* Add it to the target list */
     1846                *p = pick;
     1847                p = &pick->next;
    18431848        }
    18441849}
Note: See TracChangeset for help on using the changeset viewer.