***本記事にはプロモーションが含まれています。***
Linuxカーネル内のアトミック操作には、atomic_readとか、atomic_incといった関数があります。この場合の、アトミックというのは、スレッドが複数あったときに、メモリから変数を読んで、増やして、書き込むまで同時に増やそうとしないということを言います。
typdef struct {volatile int counter;} atomic_t;
というタイプが宣言されていて、atomic_read(v)とすると、(v)->counterが読まれます。counterは、volatileですのでgccが最適化せずにちゃんとメモリ上の値を読んで来ます。
また、atomic_incは、
static inline void atomic_inc(atomic_t *v) { __asm__ __volatile__ ( LOCK "incl %0" :"=m" (v->counter) : "m" (v->counter)); }
のようになっていて、LOCKプレフィックスが付いているので、数を1増やすのがアトミックに出来るようになっています。
LOCKは、"lock; "に定義されています。
また、BUG_ON(condition)というマクロがあって、conditionが成立した時、エラーメッセージを出しpanicします。
これだけわかると、
static inline struct dentry *dget(struct dentry *dentry) { if (dentry) { BUG_ON(!atomic_read(&dentry->d_count)); atomic_inc(&dentry->d_count); } return dentry; }
は、dentry->d_countが0だったらエラーメッセージを出し、アトミックに参照カウントを増やしてそのままdentryを返す関数であることがわかります。
このくらいだったらわかるのですけどね。
Linuxのソースコードを読むって、EmacsだとM-x cdでディレクトリを変えて、M-x grep-findで片っ端から検索していくことになります。どこに何があるのかを知らないと始まらないのでしょうがないですけど。
ちなみに、コマンドラインでは、
find . |xargs grep hogehoge
というのを、よく使います。