ログ日記

作業ログと日記とメモ

カーネルコーディングスタイルの続き

http://d.hatena.ne.jp/n314/20080413/1208081924 の続き。というか前に流し読んだ部分をもう一度読む。
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/CodingStyle.html

関数プロトタイプ内には、データの型と一緒に、パラメータ名を含めてください。
これはC言語にとって、仕様上、必要ではありませんが、読み手にとって価値のあ
る情報を加える簡単な方法なので、Linux では推奨されます。

ロックは、参照カウンタの代わりにはなりません。
ロックは、データの一貫性を保つのに使います、一方、参照カウンタは、メモリ管
理において利用されます。通常、両方とも必要であり、互いに混同してはいけません。


実は多くのデータ構造は、異なる "class" のユーザーを持つ場合において、2段
階の参照カウンタを持っています。subclass カウンタは subclass ユーザー数を
カウントし、カウンタが0になった場合に限ってグローバルカウンタをデクリメ
ントします。


この多段階の参照カウンタの例が、メモリ管理に見受けられます(mm_struct
構造体の mm_users と mm_count です)。ファイルシステムのコードにも見受けら
れます(super_block 構造体の s_count と s_active です)。


覚えておいてください - 別のスレッドがあなたのデータ構造を探すことができる
のに、あなたはそのデータ構造に参照カウンタを持っていないとすると、ほぼ確
実にバグを引き起こします。

マクロは大文字が好ましいですが、関数形式マクロは小文字でも構いません。


一般的に、関数形式マクロよりもインライン関数の方が望ましいでしょう。

3) 左辺値として使われる引数付マクロ - FOO(x) = y - 例えば、もし誰かがこの
マクロをインライン関数に変更しようとすれば文句を言われるでしょう。

include/linux/kernel.h ヘッダファイルには、明らかにあなた自身がその変種を
コーディングするよりも、あなたが使うべき数多くのマクロを含んでいます。例えば
あなたが配列の長さを計算する必要があるなら、以下のマクロを上手く利用してくだ
さい。


#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))


同様に、もしあなたが構造体メンバのサイズを計算する必要があるなら、次のマク
ロを利用してください。


#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))