2010年6月24日木曜日

container_of

 

LinuxのDevice Driverを眺めていると、ちょくちょく見かけるマクロです。
使う機会も割と多いため、覚えて損は無いです。

私も忘れないように一応メモを。

 

定義場所は”$(kernel_dir)/include/linux/kernel.h”
(kernelはlinux-2.6.34を参照)

#define container_of(ptr, type, member) ({ \
        const typeof( ((type *)0)->member ) *__mptr = (ptr); \
        (type *)( (char *)__mptr – offsetof(type,member) );})

Cast a member of a structure out to the containing structure.
てことで、memberを入れると、それを持ってる変数のaddressを返してくれるです。

 

具体的には、

struct test_structure {
    struct sub_structure member;
};

struct test_structure parent;
struct sub_structure *child = &parent.member;

struct test_structure *test;
test = container_of(child, struct test_structure, member);

これでtestにはparentのアドレスが入るって動きです。

 

「”私(1)”は”○○構造体(2)”の”××っていうmember(3)”です!」と言えば、
親を探してくれるって感じで覚えてます。
# 数字は引数の順番

0 件のコメント:

コメントを投稿