Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/match.c

    r4087a33 rc6c389ed  
    4343                return 0;
    4444       
    45         /*
    46          * Find first matching pair.
    47          */
    4845        link_t *drv_link = drv->match_ids.ids.next;
    49         while (drv_link != drv_head) {
    50                 link_t *dev_link = dev->match_ids.ids.next;
    51                 while (dev_link != dev_head) {
    52                         match_id_t *drv_id = list_get_instance(drv_link, match_id_t, link);
    53                         match_id_t *dev_id = list_get_instance(dev_link, match_id_t, link);
    54 
    55                         if (str_cmp(drv_id->id, dev_id->id) == 0) {
    56                                 /*
    57                                  * We found a match.
    58                                  * Return the score of the match.
    59                                  */
    60                                 return drv_id->score * dev_id->score;
    61                         }
    62 
     46        link_t *dev_link = dev->match_ids.ids.next;
     47       
     48        match_id_t *drv_id = list_get_instance(drv_link, match_id_t, link);
     49        match_id_t *dev_id = list_get_instance(dev_link, match_id_t, link);
     50       
     51        int score_next_drv = 0;
     52        int score_next_dev = 0;
     53       
     54        do {
     55                match_id_t *tmp_ma_id;
     56       
     57                if (str_cmp(drv_id->id, dev_id->id) == 0) {
     58                        /*
     59                         * We found a match.
     60                         * Return the score of the match.
     61                         */
     62                        return drv_id->score * dev_id->score;
     63                }
     64               
     65                /*
     66                 * Compute the next score we get, if we advance in the driver's
     67                 * list of match ids.
     68                 */
     69                if (drv_link->next != drv_head) {
     70                        tmp_ma_id = list_get_instance(drv_link->next,
     71                            match_id_t, link);
     72                        score_next_drv = dev_id->score * tmp_ma_id->score;
     73                } else {
     74                        score_next_drv = 0;
     75                }
     76               
     77                /*
     78                 * Compute the next score we get, if we advance in the device's
     79                 * list of match ids.
     80                 */
     81                if (dev_link->next != dev_head) {
     82                        tmp_ma_id = list_get_instance(dev_link->next,
     83                            match_id_t, link);
     84                        score_next_dev = drv_id->score * tmp_ma_id->score;
     85                } else {
     86                        score_next_dev = 0;
     87                }
     88               
     89                /*
     90                 * Advance in one of the two lists, so we get the next highest
     91                 * score.
     92                 */
     93                if (score_next_drv > score_next_dev) {
     94                        drv_link = drv_link->next;
     95                        drv_id = list_get_instance(drv_link, match_id_t, link);
     96                } else {
    6397                        dev_link = dev_link->next;
     98                        dev_id = list_get_instance(dev_link, match_id_t, link);
    6499                }
    65                 drv_link = drv_link->next;
    66         }
     100               
     101        } while (drv_link->next != drv_head && dev_link->next != dev_head);
    67102       
    68103        return 0;
Note: See TracChangeset for help on using the changeset viewer.