mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Object locks use events
Instead of calling custom hooks from object locks, we use standard event sending mechanism to inform protocols about object lock changes. As event sending is lockless, the unlocking protocol simply enqueues the appropriate event to the given loop when the locking is done.
This commit is contained in:
@@ -266,9 +266,9 @@ radv_iface_find(struct radv_proto *p, struct iface *what)
|
||||
}
|
||||
|
||||
static void
|
||||
radv_iface_add(struct object_lock *lock)
|
||||
radv_iface_add(void *_ifa)
|
||||
{
|
||||
struct radv_iface *ifa = lock->data;
|
||||
struct radv_iface *ifa = _ifa;
|
||||
struct radv_proto *p = ifa->ra;
|
||||
|
||||
if (! radv_sk_open(ifa))
|
||||
@@ -305,8 +305,11 @@ radv_iface_new(struct radv_proto *p, struct iface *iface, struct radv_iface_conf
|
||||
lock->type = OBJLOCK_IP;
|
||||
lock->port = ICMPV6_PROTO;
|
||||
lock->iface = iface;
|
||||
lock->data = ifa;
|
||||
lock->hook = radv_iface_add;
|
||||
lock->event = (event) {
|
||||
.hook = radv_iface_add,
|
||||
.data = ifa,
|
||||
};
|
||||
lock->target = &global_event_list;
|
||||
ifa->lock = lock;
|
||||
|
||||
olock_acquire(lock);
|
||||
|
||||
Reference in New Issue
Block a user