*参照元 [#h0454463] #backlinks *説明 [#ja2f0398] -パス: [[linux-2.6.33/fs/fcntl.c]] -FIXME: これは何? --説明 **引数 [#w3e631f7] -int fd -- -struct file * filp - --[[linux-2.6.33/file]] -int on -- -struct fasync_struct **fapp -- --[[linux-2.6.33/fasync_struct]] **返り値 [#q382030c] -int --リストに登録出来れば 1 を返す。 既に登録済みで登録しなかった場合は 0 を返す。 エラーの場合は負の値を返す。 **参考 [#i30b78d5] *実装 [#z2a75d02] /* * Add a fasync entry. Return negative on error, positive if * added, and zero if did nothing but change an existing one. * * NOTE! It is very important that the FASYNC flag always * match the state "is the filp on a fasync list". */ static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp) { struct fasync_struct *new, *fa, **fp; int result = 0; new = kmem_cache_alloc(fasync_cache, GFP_KERNEL); if (!new) return -ENOMEM; - --[[linux-2.6.33/kmem_cache_alloc()]] - --[[linux-2.6.33/fasync_cache(global)]] - --[[linux-2.6.33/GFP_KERNEL]] - --[[linux-2.6.33/ENOMEM]] spin_lock(&filp->f_lock); write_lock_irq(&fasync_lock); - --[[linux-2.6.33/spin_lock()]] - --[[linux-2.6.33/write_lock()]] for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) { if (fa->fa_file != filp) continue; fa->fa_fd = fd; kmem_cache_free(fasync_cache, new); goto out; -リストに既に同じ fd が登録されていたら、 -リストに既に同じ filp が登録されていたら、 何もしないで終了し、result( = 0)を返す。 --[[linux-2.6.33/kmem_cache_free()]] } new->magic = FASYNC_MAGIC; new->fa_file = filp; new->fa_fd = fd; new->fa_next = *fapp; *fapp = new; result = 1; filp->f_flags |= FASYNC; -新たにリストのメンバを登録する。 --[[linux-2.6.33/FASYNC_MAGIC]] --[[linux-2.6.33/FASYNC]] out: write_unlock_irq(&fasync_lock); spin_unlock(&filp->f_lock); - --[[linux-2.6.33/write_unlock()]] --[[linux-2.6.33/spin_unlock()]] return result; } *コメント [#i4cdec3d]