diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 9a3c73b1a5..54e7046747 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -79,7 +79,7 @@ struct AddressHashDefinition { typedef BOpenHashTable AddressTable; -static mutex sLock; +static recursive_lock sLock; static InterfaceList sInterfaces; static mutex sHashLock; static AddressTable sAddressTable; @@ -91,7 +91,7 @@ static uint32 sInterfaceIndex; void dump_interface_refs(void) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -933,6 +933,7 @@ Interface::SetDown() if ((flags & IFF_UP) == 0) return; + RecursiveLocker interfacesLocker(sLock); RecursiveLocker locker(fLock); DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator(); @@ -1173,7 +1174,7 @@ Interface::_ChangeAddress(RecursiveLocker& locker, InterfaceAddress* address, static struct Interface* find_interface(const char* name) { - ASSERT_LOCKED_MUTEX(&sLock); + ASSERT_LOCKED_RECURSIVE(&sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1208,7 +1209,7 @@ status_t add_interface(const char* name, net_domain_private* domain, const ifaliasreq& request, net_device_interface* deviceInterface) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); if (find_interface(name) != NULL) return B_NAME_IN_USE; @@ -1249,7 +1250,7 @@ remove_interface(Interface* interface) interface->SetDown(); interface->RemoveAddresses(); - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); sInterfaces.Remove(interface); locker.Unlock(); @@ -1265,7 +1266,7 @@ remove_interface(Interface* interface) void interface_removed_device_interface(net_device_interface* deviceInterface) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); Interface* interface = find_interface(deviceInterface->device->name); if (interface != NULL) @@ -1396,7 +1397,7 @@ update_interface_address(InterfaceAddress* interfaceAddress, int32 option, Interface* get_interface(net_domain* domain, uint32 index) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); Interface* interface; if (index == 0) @@ -1417,7 +1418,7 @@ get_interface(net_domain* domain, uint32 index) Interface* get_interface(net_domain* domain, const char* name) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); Interface* interface = find_interface(name); if (interface == NULL) @@ -1434,7 +1435,7 @@ get_interface(net_domain* domain, const char* name) Interface* get_interface_for_device(net_domain* domain, uint32 index) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1460,7 +1461,7 @@ get_interface_for_link(net_domain* domain, const sockaddr* _linkAddress) { sockaddr_dl& linkAddress = *(sockaddr_dl*)_linkAddress; - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1506,7 +1507,7 @@ InterfaceAddress* get_interface_address_for_destination(net_domain* domain, const sockaddr* destination) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1533,7 +1534,7 @@ get_interface_address_for_link(net_domain* domain, const sockaddr* address, { sockaddr_dl& linkAddress = *(sockaddr_dl*)address; - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1558,7 +1559,7 @@ get_interface_address_for_link(net_domain* domain, const sockaddr* address, uint32 count_interfaces() { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); return sInterfaces.Count(); } @@ -1571,7 +1572,7 @@ count_interfaces() status_t list_interfaces(int family, void* _buffer, size_t* bufferSize) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); UserBuffer buffer(_buffer, *bufferSize); @@ -1619,7 +1620,7 @@ list_interfaces(int family, void* _buffer, size_t* bufferSize) status_t init_interfaces() { - mutex_init(&sLock, "net interfaces"); + recursive_lock_init(&sLock, "net interfaces"); mutex_init(&sHashLock, "net local addresses"); new (&sInterfaces) InterfaceList; @@ -1650,7 +1651,7 @@ uninit_interfaces() remove_debugger_command("net_route", &dump_route); #endif - mutex_destroy(&sLock); + recursive_lock_destroy(&sLock); mutex_destroy(&sHashLock); return B_OK; }