hrev47876 adds 1 changeset to branch 'master' old head: 3ae6595c3930331b01ec7841b4770d6e20707fa5 new head: ef860b2e96dd762a8ca074156b120599436967bd overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=ef860b2+%5E3ae6595 ---------------------------------------------------------------------------- ef860b2: NetStack: Fix locking Change the monitor_lock to be a recursive_lock, fixing #7039. Notify_device_monitor acquires the monitor lock, then the monitor unregisters itself, calling unregister_device_monitor, which acquires the monitor lock again. [ Stefano Ceccherini <stefano.ceccherini@xxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev47876 Commit: ef860b2e96dd762a8ca074156b120599436967bd URL: http://cgit.haiku-os.org/haiku/commit/?id=ef860b2 Author: Stefano Ceccherini <stefano.ceccherini@xxxxxxxxx> Date: Thu Sep 18 19:45:44 2014 UTC Ticket: https://dev.haiku-os.org/ticket/7039 ---------------------------------------------------------------------------- 2 files changed, 9 insertions(+), 9 deletions(-) .../kernel/network/stack/device_interfaces.cpp | 16 ++++++++-------- src/add-ons/kernel/network/stack/device_interfaces.h | 2 +- ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/network/stack/device_interfaces.cpp b/src/add-ons/kernel/network/stack/device_interfaces.cpp index a3030f0..0143360 100644 --- a/src/add-ons/kernel/network/stack/device_interfaces.cpp +++ b/src/add-ons/kernel/network/stack/device_interfaces.cpp @@ -171,7 +171,7 @@ allocate_device_interface(net_device* device, net_device_module_info* module) return NULL; recursive_lock_init(&interface->receive_lock, "device interface receive"); - mutex_init(&interface->monitor_lock, "device interface monitors"); + recursive_lock_init(&interface->monitor_lock, "device interface monitors"); char name[128]; snprintf(name, sizeof(name), "%s receive queue", device->name); @@ -206,7 +206,7 @@ error2: uninit_fifo(&interface->receive_queue); error1: recursive_lock_destroy(&interface->receive_lock); - mutex_destroy(&interface->monitor_lock); + recursive_lock_destroy(&interface->monitor_lock); delete interface; return NULL; @@ -216,7 +216,7 @@ error1: static void notify_device_monitors(net_device_interface* interface, int32 event) { - MutexLocker locker(interface->monitor_lock); + RecursiveLocker locker(interface->monitor_lock); DeviceMonitorList::Iterator iterator = interface->monitor_funcs.GetIterator(); @@ -392,7 +392,7 @@ put_device_interface(struct net_device_interface* interface) device->module->uninit_device(device); put_module(moduleName); - mutex_destroy(&interface->monitor_lock); + recursive_lock_destroy(&interface->monitor_lock); recursive_lock_destroy(&interface->receive_lock); delete interface; } @@ -478,7 +478,7 @@ void device_interface_monitor_receive(net_device_interface* interface, net_buffer* buffer) { - MutexLocker locker(interface->monitor_lock); + RecursiveLocker locker(interface->monitor_lock); DeviceMonitorList::Iterator iterator = interface->monitor_funcs.GetIterator(); @@ -706,7 +706,7 @@ register_device_monitor(net_device* device, net_device_monitor* monitor) if (interface == NULL) return B_DEVICE_NOT_FOUND; - MutexLocker monitorLocker(interface->monitor_lock); + RecursiveLocker monitorLocker(interface->monitor_lock); interface->monitor_funcs.Add(monitor); atomic_add(&interface->monitor_count, 1); @@ -725,7 +725,7 @@ unregister_device_monitor(net_device* device, net_device_monitor* monitor) if (interface == NULL) return B_DEVICE_NOT_FOUND; - MutexLocker monitorLocker(interface->monitor_lock); + RecursiveLocker monitorLocker(interface->monitor_lock); // search for the monitor @@ -776,7 +776,7 @@ device_removed(net_device* device) // By now all of the monitors must have removed themselves. If they // didn't, they'll probably wait forever to be callback'ed again. - mutex_lock(&interface->monitor_lock); + recursive_lock_lock(&interface->monitor_lock); interface->monitor_funcs.RemoveAll(); // All of the readers should be gone as well since we are out of diff --git a/src/add-ons/kernel/network/stack/device_interfaces.h b/src/add-ons/kernel/network/stack/device_interfaces.h index 6dcc4c0..958448e 100644 --- a/src/add-ons/kernel/network/stack/device_interfaces.h +++ b/src/add-ons/kernel/network/stack/device_interfaces.h @@ -37,7 +37,7 @@ struct net_device_interface : DoublyLinkedListLinkImpl<net_device_interface> { int32 deframe_ref_count; int32 monitor_count; - mutex monitor_lock; + recursive_lock monitor_lock; DeviceMonitorList monitor_funcs; DeviceHandlerList receive_funcs;