linux-2.6.33/atomic_sub_return()(arm)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#r4f55429]
#backlinks
*説明 [#w88cf56e]
-パス: [[linux-2.6.33/arch/arm/include/asm/atomic.h]]
-アトミック値から指定した値を減算し、減算後の値を返す。
--ARMv6 以前の場合は SMP が使用できないので、
SMP を有効にするとコンパイルエラーが起きるようにしている。
**引数 [#x0b8e60a]
-int i
--減算する値
-atomic_t *v
--減算対象のアトミック値
--[[linux-2.6.33/atomic_t]]
**返り値 [#n37146b4]
-int
--減算後の v の値
**参考 [#hec79802]
*実装 [#k318973c]
#if __LINUX_ARM_ARCH__ >= 6
-armv6 以上の場合
--[[linux-2.6.33/__LINUX_ARM_ARCH__]]
static inline int atomic_sub_return(int i, atomic_t *v)
{
unsigned long tmp;
int result;
smp_mb();
-
--[[linux-2.6.33/smp_mb()]]
__asm__ __volatile__("@ atomic_sub_return\n"
"1: ldrex %0, [%2]\n"
" sub %0, %0, %3\n"
" strex %1, %0, [%2]\n"
" teq %1, #0\n"
" bne 1b"
: "=&r" (result), "=&r" (tmp)
: "r" (&v->counter), "Ir" (i)
: "cc");
smp_mb();
return result;
}
(略)
#else /* ARM_ARCH_6 */
-armv6 以前の場合
#ifdef CONFIG_SMP
#error SMP not supported on pre-ARMv6 CPUs
-armv6 以前の場合、SMP に対応していないためコンパイルエラ...
--[[linux-2.6.33/CONFIG_SMP]]
#endif
static inline int atomic_sub_return(int i, atomic_t *v)
{
unsigned long flags;
int val;
raw_local_irq_save(flags);
-
--[[linux-2.6.33/raw_local_irq_save()]]
val = v->counter;
v->counter = val -= i;
raw_local_irq_restore(flags);
-
--[[linux-2.6.33/raw_local_irq_restore()]]
return val;
}
(略)
#endif /* __LINUX_ARM_ARCH__ */
*コメント [#j0e77ea9]
終了行:
*参照元 [#r4f55429]
#backlinks
*説明 [#w88cf56e]
-パス: [[linux-2.6.33/arch/arm/include/asm/atomic.h]]
-アトミック値から指定した値を減算し、減算後の値を返す。
--ARMv6 以前の場合は SMP が使用できないので、
SMP を有効にするとコンパイルエラーが起きるようにしている。
**引数 [#x0b8e60a]
-int i
--減算する値
-atomic_t *v
--減算対象のアトミック値
--[[linux-2.6.33/atomic_t]]
**返り値 [#n37146b4]
-int
--減算後の v の値
**参考 [#hec79802]
*実装 [#k318973c]
#if __LINUX_ARM_ARCH__ >= 6
-armv6 以上の場合
--[[linux-2.6.33/__LINUX_ARM_ARCH__]]
static inline int atomic_sub_return(int i, atomic_t *v)
{
unsigned long tmp;
int result;
smp_mb();
-
--[[linux-2.6.33/smp_mb()]]
__asm__ __volatile__("@ atomic_sub_return\n"
"1: ldrex %0, [%2]\n"
" sub %0, %0, %3\n"
" strex %1, %0, [%2]\n"
" teq %1, #0\n"
" bne 1b"
: "=&r" (result), "=&r" (tmp)
: "r" (&v->counter), "Ir" (i)
: "cc");
smp_mb();
return result;
}
(略)
#else /* ARM_ARCH_6 */
-armv6 以前の場合
#ifdef CONFIG_SMP
#error SMP not supported on pre-ARMv6 CPUs
-armv6 以前の場合、SMP に対応していないためコンパイルエラ...
--[[linux-2.6.33/CONFIG_SMP]]
#endif
static inline int atomic_sub_return(int i, atomic_t *v)
{
unsigned long flags;
int val;
raw_local_irq_save(flags);
-
--[[linux-2.6.33/raw_local_irq_save()]]
val = v->counter;
v->counter = val -= i;
raw_local_irq_restore(flags);
-
--[[linux-2.6.33/raw_local_irq_restore()]]
return val;
}
(略)
#endif /* __LINUX_ARM_ARCH__ */
*コメント [#j0e77ea9]
ページ名: