git: ddc7fd6641c3 - main - netlink: provide snl_clone() to create a secondary snl state
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 20 Jan 2025 21:15:47 UTC
The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=ddc7fd6641c38a00d8d299d69ba57f0657f5eaac commit ddc7fd6641c38a00d8d299d69ba57f0657f5eaac Author: Gleb Smirnoff <glebius@FreeBSD.org> AuthorDate: 2025-01-20 21:15:39 +0000 Commit: Gleb Smirnoff <glebius@FreeBSD.org> CommitDate: 2025-01-20 21:15:39 +0000 netlink: provide snl_clone() to create a secondary snl state The function will clone an existing snl_state(). The clone points at the same socket, but has a separate allocator. Closing a clone frees the memory, but doesn't close the socket. Such clones are handy in a multithreaded process that has a single socket with multiple writers and a serialized reader. It can be easily extended to support multiple readers, too, but now there is no use. Reviewed by: melifaro Differential Revision: https://reviews.freebsd.org/D48568 --- sys/netlink/netlink_snl.h | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/sys/netlink/netlink_snl.h b/sys/netlink/netlink_snl.h index 44967b6f444a..faaeebe52eac 100644 --- a/sys/netlink/netlink_snl.h +++ b/sys/netlink/netlink_snl.h @@ -240,14 +240,13 @@ snl_clear_lb(struct snl_state *ss) static void snl_free(struct snl_state *ss) { - if (ss->init_done) { + if (ss->init_done) close(ss->fd); - if (ss->buf != NULL) - free(ss->buf); - if (ss->lb != NULL) { - snl_clear_lb(ss); - lb_free(ss->lb); - } + if (ss->buf != NULL) + free(ss->buf); + if (ss->lb != NULL) { + snl_clear_lb(ss); + lb_free(ss->lb); } } @@ -290,6 +289,16 @@ snl_init(struct snl_state *ss, int netlink_family) return (true); } +static inline bool +snl_clone(struct snl_state *ss, const struct snl_state *orig) +{ + *ss = (struct snl_state){ + .fd = orig->fd, + .init_done = false, + }; + return ((ss->lb = lb_init(SCRATCH_BUFFER_SIZE)) != NULL); +} + static inline bool snl_send(struct snl_state *ss, void *data, int sz) {