[ https://issues.apache.org/jira/browse/TS-2251?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13777153#comment-13777153 ]
Yunkai Zhang commented on TS-2251: ---------------------------------- But the code is simpler than before, it's ok for me. > LogBuffer::destroy() defeated by compiler optimizations > ------------------------------------------------------- > > Key: TS-2251 > URL: https://issues.apache.org/jira/browse/TS-2251 > Project: Traffic Server > Issue Type: Bug > Components: Logging, Portability, Quality > Reporter: James Peach > > {{LogBuffer::destroy()}} uses atomic compare and swaps on the {{LogBuffer}} > reference count to decrement the refcount and destroy the LogBuffer object. > However, the compiler (Apple clang-500.2.75) hoists the read of > LogBuffer::m_references out of the loop, so it won't work correctly if > {{ink_atomic_cas}} ever fails: > {code} > __ZN9LogBuffer7destroyEPS_: ## @_ZN9LogBuffer7destroyEPS_ > .cfi_startproc > .cfi_personality 155, ___gxx_personality_v0 > Leh_func_begin1: > .cfi_lsda 16, Lexception1 > Lfunc_begin1: > .loc 1 66 0 ## > /Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:66:0 > ## BB#0: > pushq %rbp > Ltmp13: > .cfi_def_cfa_offset 16 > Ltmp14: > .cfi_offset %rbp, -16 > movq %rsp, %rbp > Ltmp15: > .cfi_def_cfa_register %rbp > pushq %r14 > pushq %rbx > subq $32, %rsp > Ltmp16: > .cfi_offset %rbx, -32 > Ltmp17: > .cfi_offset %r14, -24 > ##DEBUG_VALUE: destroy:lb <- RDI+0 > movq %rdi, %rbx > {code} > Notice that the following load of LogBuffer::m_references is outside the loop > labelled {{LBB1_1}}: > {code} > Ltmp18: > ##DEBUG_VALUE: destroy:lb <- RBX+0 > .loc 1 70 0 prologue_end ## > /Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:70:0 > leaq 104(%rbx), %rsi > Ltmp19: > ##DEBUG_VALUE: ink_atomic_cas<int>:mem <- RSI+0 > .align 4, 0x90 > LBB1_1: ## =>This Inner Loop Header: Depth=1 > ##DEBUG_VALUE: destroy:lb <- RBX+0 > ##DEBUG_VALUE: ink_atomic_cas<int>:mem <- RSI+0 > movl (%rsi), %ecx > Ltmp20: > ##DEBUG_VALUE: old_ref <- ECX+0 > ##DEBUG_VALUE: ink_atomic_cas<int>:prev <- ECX+0 > .loc 1 71 0 ## > /Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:71:0 > leal -1(%rcx), %edx > Ltmp21: > ##DEBUG_VALUE: ink_atomic_cas<int>:next <- EDX+0 > ##DEBUG_VALUE: new_ref <- EDX+0 > .loc 29 153 0 ## > /Users/jpeach/src/trafficserver.git/lib/ts/ink_atomic.h:153:0 > movl %ecx, %eax > lock > cmpxchgl %edx, (%rsi) > cmpl %ecx, %eax > Ltmp22: > .loc 1 73 0 ## > /Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:73:0 > jne LBB1_1 > Ltmp23: > ## BB#2: > ##DEBUG_VALUE: destroy:lb <- RBX+0 > .loc 1 75 0 ## > /Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:75:0 > testl %ecx, %ecx > jle LBB1_15 > ## BB#3: > ##DEBUG_VALUE: destroy:lb <- RBX+0 > .loc 1 77 0 ## > /Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:77:0 > testl %edx, %edx > jne LBB1_14 > ## BB#4: > ##DEBUG_VALUE: destroy:lb <- RBX+0 > testq %rbx, %rbx > jne LBB1_5 > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira