stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Sebor (JIRA)" <j...@apache.org>
Subject [jira] Commented: (STDCXX-792) __rw_locale::_C_manage() uses mutex based __rw_atomic_preincrement() even if platform supports the native atomic operations
Date Tue, 25 Mar 2008 03:41:26 GMT

    [ https://issues.apache.org/jira/browse/STDCXX-792?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12581767#action_12581767
] 

Martin Sebor commented on STDCXX-792:
-------------------------------------

I don't think the patch is safe. In particular, without the {{volatile}} qualifier an optimizer
would be free to turn the {{while}} loop below into an infinite loop.

{noformat}
   808              static volatile long ginit /* = 0 */;
   809  
   810              if (!ginit && 1 == _RWSTD_ATOMIC_PREINCREMENT (ginit, false))
{
   811                  global  = _C_manage (0, "C");
   812                  ginit  += 1000;
   813              }
   814              else {
   815                  while (ginit < 1000);
   816              }
{noformat}

I agree that we should change the {{__rw_atomic_xxx()}} functions to take a {{volatile}}-qualified
argument and also that such a change would probably be binary incompatible. What we might
want to do in the meantime is either cast away the {{volatile}} qualifier in the invocation
of the {{_RWSTD_ATOMIC_PREINCREMENT()}} macro or change the definition of the macro itself
to this effect.

> __rw_locale::_C_manage() uses mutex based __rw_atomic_preincrement() even if platform
supports the native atomic operations
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: STDCXX-792
>                 URL: https://issues.apache.org/jira/browse/STDCXX-792
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 22. Localization
>    Affects Versions: 4.1.2, 4.1.3, 4.1.4, 4.2.0
>         Environment: All
>            Reporter: Farid Zaripov
>            Assignee: Farid Zaripov
>             Fix For: 4.2.1
>
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
> In __rw_locale::_C_manage() (src/locale_body.cpp, line 808), the static variable ginit
declared as volatile, but __rw_atomic_preincrement() functions, which are implemented using
atomic operations, accepting the non-volatile reference in parameter list. As a result the
template version __rw_atomic_preincrement<volatile long>() (which is implemented using
mutex object) is used.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message