linux-2.6.33/fasync_add_entry()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#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, positiv...
* added, and zero if did nothing but change an existing...
*
* 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, s...
{
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;
-リストに既に同じ 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]
終了行:
*参照元 [#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, positiv...
* added, and zero if did nothing but change an existing...
*
* 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, s...
{
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;
-リストに既に同じ 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]
ページ名: