summaryrefslogtreecommitdiff
path: root/proto/ospf
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2023-01-24 11:01:34 +0100
committerMaria Matejka <mq@ucw.cz>2023-01-26 13:22:28 +0100
commit05d8c3699d51866c68747167556e7c1f06390afe (patch)
treef4d02839aa5ad2086779974625e52ba5c2b028d0 /proto/ospf
parent4334f86251429eb39bfe81ff19496d141fccef84 (diff)
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. This is a backport from version 3 where these events are passed across threads. This implementation of object locks doesn't use mutexes to lock the whole data structure. In version 3, this data structure may get accessed from multiple threads and must be protected by mutex.
Diffstat (limited to 'proto/ospf')
-rw-r--r--proto/ospf/iface.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index 84c53aa1..c7a6d3d4 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -484,9 +484,9 @@ ospf_iface_find(struct ospf_proto *p, struct iface *what)
}
static void
-ospf_iface_add(struct object_lock *lock)
+ospf_iface_add(void *_ifa)
{
- struct ospf_iface *ifa = lock->data;
+ struct ospf_iface *ifa = _ifa;
struct ospf_proto *p = ifa->oa->po;
/* Open socket if interface is not stub */
@@ -668,8 +668,10 @@ ospf_iface_new(struct ospf_area *oa, struct ifa *addr, struct ospf_iface_patt *i
lock->port = OSPF_PROTO;
lock->inst = ifa->instance_id;
lock->iface = iface;
- lock->data = ifa;
- lock->hook = ospf_iface_add;
+ lock->event = (event) {
+ .hook = ospf_iface_add,
+ .data = ifa,
+ };
olock_acquire(lock);
}