*参照元 [#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]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS