Module Name: src Committed By: riastradh Date: Sun Dec 19 11:45:42 UTC 2021
Modified Files: src/sys/external/bsd/drm2/include/linux: rbtree.h Log Message: linux/rbtree: Hack up constiness. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/drm2/include/linux/rbtree.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/include/linux/rbtree.h diff -u src/sys/external/bsd/drm2/include/linux/rbtree.h:1.13 src/sys/external/bsd/drm2/include/linux/rbtree.h:1.14 --- src/sys/external/bsd/drm2/include/linux/rbtree.h:1.13 Sun Dec 19 11:45:13 2021 +++ src/sys/external/bsd/drm2/include/linux/rbtree.h Sun Dec 19 11:45:41 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: rbtree.h,v 1.13 2021/12/19 11:45:13 riastradh Exp $ */ +/* $NetBSD: rbtree.h,v 1.14 2021/12/19 11:45:41 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -51,17 +51,30 @@ struct rb_root_cached { __p ? container_of(__p, T, F) : NULL; \ }) +/* + * Several of these functions take const inputs and return non-const + * outputs. That is a deliberate choice. It would be better if these + * functions could be const-polymorphic -- return const if given const, + * return non-const if given non-const -- but C doesn't let us express + * that. We are using them to adapt Linux code that is defined in + * terms of token-substitution macros, without types of their own, + * which happen to work out with both const and non-const variants. + * Presumably the Linux code compiles upstream and has some level of + * const type-checking in Linux, so this abuse of __UNCONST does not + * carry substantial risk over to this code here. + */ + static inline bool -RB_EMPTY_ROOT(struct rb_root *root) +RB_EMPTY_ROOT(const struct rb_root *root) { - return RB_TREE_MIN(&root->rbr_tree) == NULL; + return RB_TREE_MIN(__UNCONST(&root->rbr_tree)) == NULL; } static inline struct rb_node * -rb_first(struct rb_root *root) +rb_first(const struct rb_root *root) { - char *vnode = RB_TREE_MIN(&root->rbr_tree); + char *vnode = RB_TREE_MIN(__UNCONST(&root->rbr_tree)); if (vnode) vnode += root->rbr_tree.rbt_ops->rbto_node_offset; @@ -69,18 +82,18 @@ rb_first(struct rb_root *root) } static inline struct rb_node * -rb_next2(struct rb_root *root, struct rb_node *rbnode) +rb_next2(const struct rb_root *root, const struct rb_node *rbnode) { - char *vnode = (char *)rbnode; + char *vnode = (char *)__UNCONST(rbnode); vnode -= root->rbr_tree.rbt_ops->rbto_node_offset; - return RB_TREE_NEXT(&root->rbr_tree, vnode); + return RB_TREE_NEXT(__UNCONST(&root->rbr_tree), vnode); } static inline struct rb_node * -rb_last(struct rb_root *root) +rb_last(const struct rb_root *root) { - char *vnode = RB_TREE_MAX(&root->rbr_tree); + char *vnode = RB_TREE_MAX(__UNCONST(&root->rbr_tree)); if (vnode) vnode += root->rbr_tree.rbt_ops->rbto_node_offset; @@ -88,7 +101,7 @@ rb_last(struct rb_root *root) } static inline struct rb_node * -rb_first_cached(struct rb_root_cached *root) +rb_first_cached(const struct rb_root_cached *root) { return rb_first(&root->rb_root); }