1
0
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:
Maria Matejka
2023-01-24 11:01:34 +01:00
parent 3ac628e0f0
commit f7c2a886c9
7 changed files with 75 additions and 55 deletions

View File

@@ -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);