From mboxrd@z Thu Jan 1 00:00:00 1970 From: erik quanstrom Date: Sat, 7 May 2011 09:05:57 -0400 To: 9fans@9fans.net Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: [9fans] _xinc vs ainc Topicbox-Message-UUID: e0bf55ee-ead6-11e9-9d60-3106f5b1d025 i'm confused by the recent change to the thread library. the old code was simply to do a locked incl. the new code does a locked exchange /within a loop/ until it's seen that nobody else has updated the value at the same time, thus insuring that the value has indeed been updated. since the expensive operation is the MESI(F) negotiation behind the scenes to get exclusive access to the cacheline, i don't understand the motiviation is for replacing _xinc with ainc. since ainc can loop on an expensive lock instruction. that is, i think the old version was wait free, and the new version is not. can someone explain what i'm missing here? thanks! - erik ---- TEXT _xinc(SB),$0 /* void _xinc(long *); */ MOVL l+0(FP),AX LOCK INCL 0(AX) RET ---- TEXT ainc(SB), $0 /* long ainc(long *); */ MOVL addr+0(FP), BX ainclp: MOVL (BX), AX MOVL AX, CX INCL CX LOCK BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */ JNZ ainclp MOVL CX, AX RET