summaryrefslogtreecommitdiffstats
path: root/nest/locks.h
diff options
context:
space:
mode:
Diffstat (limited to 'nest/locks.h')
-rw-r--r--nest/locks.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/nest/locks.h b/nest/locks.h
new file mode 100644
index 0000000..e465bf5
--- /dev/null
+++ b/nest/locks.h
@@ -0,0 +1,52 @@
+/*
+ * BIRD Object Locks
+ *
+ * (c) 1999 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_LOCKS_H_
+#define _BIRD_LOCKS_H_
+
+#include "lib/resource.h"
+#include "lib/event.h"
+
+/*
+ * The object locks are used for controlling exclusive access
+ * to various physical resources like UDP ports on specific devices.
+ * When you want to access such resource, you ask for a object lock
+ * structure, fill in specification of the object and your function
+ * you want to have called when the object is available and invoke
+ * olock_acquire() afterwards. When the object becomes free, the lock
+ * manager calls your function. To free the object lock, just call rfree
+ * on its resource.
+ */
+
+struct object_lock {
+ resource r;
+ ip_addr addr; /* Identification of a object: IP address */
+ unsigned int type; /* ... object type (OBJLOCK_xxx) */
+ struct iface *iface; /* ... interface */
+ unsigned int port; /* ... port number */
+ void (*hook)(struct object_lock *); /* Called when the lock succeeds */
+ void *data; /* User data */
+ /* ... internal to lock manager, don't touch ... */
+ node n; /* Node in list of olocks */
+ int state; /* OLOCK_STATE_xxx */
+ list waiters; /* Locks waiting for the same resource */
+};
+
+struct object_lock *olock_new(pool *);
+void olock_acquire(struct object_lock *);
+void olock_init(void);
+
+#define OBJLOCK_UDP 1 /* UDP port */
+#define OBJLOCK_TCP 2 /* TCP port */
+
+#define OLOCK_STATE_FREE 0
+#define OLOCK_STATE_LOCKED 1
+#define OLOCK_STATE_WAITING 2
+#define OLOCK_STATE_EVENT 3 /* waiting for unlock processing */
+
+#endif