📄 rwlock.s
字号:
/* $Id: rwlock.S,v 1.4 2000/09/09 00:00:34 davem Exp $ * rwlocks.S: These things are too big to do inline. * * Copyright (C) 1999 David S. Miller (davem@redhat.com) */ .text .align 64 /* The non-contention read lock usage is 2 cache lines. */ .globl __read_lock, __read_unlock__read_lock: /* %o0 = lock_ptr */ ldsw [%o0], %g5 brlz,pn %g5, __read_wait_for_writer4: add %g5, 1, %g7 cas [%o0], %g5, %g7 cmp %g5, %g7 bne,pn %icc, __read_lock membar #StoreLoad | #StoreStore99: retl nop__read_unlock: /* %o0 = lock_ptr */ lduw [%o0], %g5 sub %g5, 1, %g7 cas [%o0], %g5, %g7 cmp %g5, %g7 be,pt %xcc, 99b membar #StoreLoad | #StoreStore ba,a,pt %xcc, __read_unlock__read_wait_for_writer: ldsw [%o0], %g5 brlz,pt %g5, __read_wait_for_writer membar #LoadLoad ba,a,pt %xcc, 4b__write_wait_for_any: lduw [%o0], %g5 brnz,pt %g5, __write_wait_for_any membar #LoadLoad ba,a,pt %xcc, 4f .align 64 .globl __write_unlock__write_unlock: /* %o0 = lock_ptr */ membar #LoadStore | #StoreStore retl stw %g0, [%o0] .globl __write_lock__write_lock: /* %o0 = lock_ptr */ sethi %hi(0x80000000), %g21: lduw [%o0], %g5 brnz,pn %g5, __write_wait_for_any4: or %g5, %g2, %g7 cas [%o0], %g5, %g7 cmp %g5, %g7 be,pt %icc, 99b membar #StoreLoad | #StoreStore ba,a,pt %xcc, 1b .globl __write_trylock__write_trylock: /* %o0 = lock_ptr */ sethi %hi(0x80000000), %g21: lduw [%o0], %g5 brnz,pn %g5, __write_trylock_fail4: or %g5, %g2, %g7 cas [%o0], %g5, %g7 cmp %g5, %g7 be,pt %icc, __write_trylock_succeed membar #StoreLoad | #StoreStore ba,pt %xcc, 1b nop__write_trylock_succeed: retl mov 1, %o0__write_trylock_fail: retl mov 0, %o0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -