Changeset 740dafc in mainline


Ignore:
Timestamp:
2018-01-17T01:47:40Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0f803831
Parents:
2755a622
Message:

usbhub: fix race between def. address release/request

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbhub/usbhub.c

    r2755a622 r740dafc  
    627627                        async_usleep(500000);
    628628                        fibril_mutex_lock(guard);
    629                         err = usbhc_reserve_default_address(exch);
    630629                }
    631630                return err;
     
    649648int usb_hub_release_default_address(usb_hub_dev_t *hub, async_exch_t *exch)
    650649{
     650        int ret = EOK;
     651
    651652        fibril_mutex_lock(&hub->default_address_guard);
    652653        if (--hub->default_address_requests == 0) {
    653                 fibril_mutex_unlock(&hub->default_address_guard);
    654                 return usbhc_release_default_address(exch);
     654                // We must do it in critical section to prevent other fibril
     655                // from requesting the address before we release
     656                ret = usbhc_release_default_address(exch);
    655657        } else {
    656658                fibril_condvar_signal(&hub->default_address_cv);
    657                 fibril_mutex_unlock(&hub->default_address_guard);
    658                 return EOK;
    659         }
     659        }
     660        fibril_mutex_unlock(&hub->default_address_guard);
     661
     662        return ret;
    660663}
    661664
Note: See TracChangeset for help on using the changeset viewer.