Converted the "net_interfaces" mutex into a recursive locker, and

acquire it in Interface::SetDown().
This commit is contained in:
Stefano Ceccherini 2013-02-04 11:30:55 +01:00
parent afa494c44e
commit 8a6337d0f8

View File

@ -79,7 +79,7 @@ struct AddressHashDefinition {
typedef BOpenHashTable<AddressHashDefinition, true, false> 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;
}