You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficserver.apache.org by "James Peach (JIRA)" <ji...@apache.org> on 2013/09/25 01:36:02 UTC
[jira] [Created] (TS-2251) LogBuffer::destroy() defeated by
compiler optimizations
James Peach created TS-2251:
-------------------------------
Summary: 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