要在内核v4.19-rc5中初始化自旋锁,必须使用如下定义的spin_lock_init
宏:
#define spin_lock_init(_lock) do { spinlock_check(_lock); raw_spin_lock_init(&(_lock)->rlock); } while (0)
函数spinlock_check(_lock)
只返回&lock->rlock
。 本文解释说:
spinlock_check的实现非常简单,这个函数只返回给定自旋锁的raw_spinlock_t,以确保我们得到完全正常的原始自旋锁
我不明白这个函数是如何执行检查的 。 我期待ckeck函数中的一些if
语句。 对不起,我是内核编程的新手。
它不需要任何if
语句,因为它存在用于编译时检查。
您可以在此处看到,大多数自旋锁操作都被定义为宏,因此它们无法限制其参数的类型。
请考虑以下示例:
struct not_a_spinlock { raw_spinlock_t rlock; };
没有spinlock_check
我可以使用spin_lock_init
来初始化它:
struct not_a_spinlock spin; spin_lock_init(&spin);
但是由于spinlock_check
,这不起作用。 这使得这些宏受到类型限制,因此它们更像function。
它返回&lock->rlock
的原因是方便 – 它的返回值可以传递给下一个函数。
因此,从您的示例中重写宏可能值得:
#define spin_lock_init(_lock) do { raw_spin_lock_init(spinlock_check(_lock)); } while (0)
类似的技术可以与宏一起用来限制它们的参数类型,如下所示:
#define min(x, y) ({ typeof(x) _min1 = (x); typeof(y) _min2 = (y); (void) (&_min1 == &_min2); _min1 < _min2 ? _min1 : _min2; })
以上就是c/c++开发分享自旋锁初始化函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549928.html