+struct ovsdb_lock_waiter *ovsdb_session_get_lock_waiter(
+ const struct ovsdb_session *, const char *lock_name);
+
+/* A database lock.
+ *
+ * A lock always has one or more "lock waiters" kept on a list. The waiter at
+ * the head of the list owns the lock. */
+struct ovsdb_lock {
+ struct ovsdb_server *server; /* The containing server. */
+ char *name; /* Unique name. */
+ struct hmap_node hmap_node; /* In ovsdb_server's "locks" hmap. */
+ struct list waiters; /* Contains "struct ovsdb_lock_waiter"s. */
+};
+
+struct ovsdb_lock_waiter *ovsdb_lock_get_owner(const struct ovsdb_lock *);
+
+/* How to obtain a lock. */
+enum ovsdb_lock_mode {
+ OVSDB_LOCK_WAIT, /* By waiting for it to become available. */
+ OVSDB_LOCK_STEAL /* By stealing it from the owner. */
+};
+
+/* A session's request for a database lock. */
+struct ovsdb_lock_waiter {
+ enum ovsdb_lock_mode mode;
+ char *lock_name;
+
+ struct ovsdb_lock *lock; /* The lock being waited for. */
+ struct list lock_node; /* In ->lock->waiters's list. */
+
+ struct ovsdb_session *session;
+ struct hmap_node session_node; /* In ->session->locks's hmap. */
+};
+
+struct ovsdb_session *ovsdb_lock_waiter_remove(struct ovsdb_lock_waiter *);
+void ovsdb_lock_waiter_destroy(struct ovsdb_lock_waiter *);
+bool ovsdb_lock_waiter_is_owner(const struct ovsdb_lock_waiter *);
+