You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficserver.apache.org by "ASF subversion and git services (JIRA)" <ji...@apache.org> on 2013/12/12 05:46:11 UTC
[jira] [Commented] (TS-2251) LogBuffer::destroy() defeated by
compiler optimizations
[ https://issues.apache.org/jira/browse/TS-2251?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13846063#comment-13846063 ]
ASF subversion and git services commented on TS-2251:
-----------------------------------------------------
Commit 7244c89db2c0408c286f6f21fae94fceca24fd43 in branch refs/heads/master from [~jpeach@apache.org]
[ https://git-wip-us.apache.org/repos/asf?p=trafficserver.git;h=7244c89 ]
TS-2251: simplify LogBuffer reference counting
> 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
> Assignee: James Peach
> Priority: Trivial
> Fix For: 4.2.0
>
>
> {{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 was sent by Atlassian JIRA
(v6.1.4#6159)