RFR (XS) 8047212: fix race between ObjectMonitor alloc and verification code

David Holmes david.holmes at oracle.com
Wed Oct 21 04:27:14 UTC 2015


On 21/10/2015 1:53 PM, Carsten Varming wrote:
> Dear David,
>
> In this case dummytype is the result of a typedef. "typedef int*
> dummytype; volatile dummytype * dummy" is the same as "typedef int*
> dummytype; dummytype volatile * dummy". Nevertheless, I always recommend
> sticking to postfix unary type operators in macros to minimize confusion
> with substitution.

The role of the typedef was tickling something in my memory :) Yes you 
are right - the typedef solves this problem. Which means that the 
existing is correct and Dan's new macro is not needed either.

Thanks,
David
-----

> Carsten
>
> On Tue, Oct 20, 2015 at 8:39 PM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     On 21/10/2015 1:37 PM, Daniel D. Daugherty wrote:
>
>         On 10/20/15, 9:18 PM, David Holmes wrote:
>
>             <trimming>
>
>             On 21/10/2015 12:44 PM, Daniel D. Daugherty wrote:
>
>                 On 10/20/15, 8:15 PM, David Holmes wrote:
>
>                     On 21/10/2015 12:51 AM, Daniel D. Daugherty wrote:
>
>                         On 10/20/15, 1:53 AM, David Holmes wrote:
>
>                             src/share/vm/runtime/vmStructs.cpp
>
>                             Can you not just define volatile_static_field?
>
>
>                         Yes, I went that way originally and then I
>                         changed my mind to
>                         avoid colliding with the other format. See below.
>
>
>                             Why does the ptr aspect need to come into
>                             it? Also "static pointer
>                             volatile field" sounds really odd, it is a
>                             static, volatile field
>                             that
>                             happens to be a pointer-type.
>
>
>                         It's meant to be odd because it follows the
>                         actual decl:
>
>                               static ObjectMonitor * volatile gBlockList;
>
>                         So "static pointer volatile field" is exactly
>                         what I have:
>
>                               static ObjectMonitor * volatile gBlockList;
>
>                            => (static ObjectMonitor *) volatile gBlockList;
>
>                         i.e. I have a static ObjectMonitor pointer that
>                         is volatile
>
>
>                         Compared to these two forms:
>
>                               static volatile ObjectMonitor * gBlockList;
>                               static ObjectMonitor volatile * gBlockList;
>
>                            => static (volatile ObjectMonitor) * gBlockList;
>                            => static (ObjectMonitor volatile) * gBlockList;
>
>                         i.e. I have a static pointer to a volatile
>                         ObjectMonitor.
>
>                         Hopefully, this makes my reasons a bit more clear...
>
>
>                     Not really :) Yes there is a difference between a
>                     "volatile pointer to
>                     Foo" and "pointer to a volatile Foo", but for the
>                     sake of vmstructs we
>                     don't really seem to need to care about that. The
>                     two questions are:
>                     - is the field/variable static
>                     - is the field/variable volatile
>
>
>                 I'll have to politely disagree:
>
>                 Here's the existing volatile non-static macro:
>
>                 2743 // This macro checks the type of a volatile
>                 VMStructEntry by
>                 comparing pointer types
>                 2744 #define
>                 CHECK_VOLATILE_NONSTATIC_VM_STRUCT_ENTRY(typeName,
>                 fieldName, type)        \
>                 2745  {typedef type dummyvtype; typeName *dummyObj =
>                 NULL; volatile
>                 dummyvtype* dummy = &dummyObj->fieldName; }
>
>                 And here's the new static pointer volatile macro:
>
>                 2751 // This macro checks the type of a static pointer
>                 volatile
>                 VMStructEntry by comparing pointer types,
>                 2752 // e.g.: "static ObjectMonitor * volatile gBlockList;"
>                 2753 #define
>                 CHECK_STATIC_PTR_VOLATILE_VM_STRUCT_ENTRY(typeName,
>                 fieldName, type)       \
>                 2754  {type volatile * dummy = &typeName::fieldName; }
>
>                 Yes, the variable assignments are different because we
>                 have static
>                 versus a non-static situation, but what's more important
>                 is where
>                 the "volatile" is positioned.
>
>
>             I see your point. But I think the real problem is that there
>             is a bug
>             in the declaration of
>             CHECK_VOLATILE_NONSTATIC_VM_STRUCT_ENTRY that
>             makes it wrong when used with a pointer type. I think this:
>
>             2745  {typedef type dummyvtype; typeName *dummyObj = NULL;
>             volatile
>             dummyvtype* dummy = &dummyObj->fieldName; }
>
>             should really be:
>
>             2745  {typedef type dummyvtype; typeName *dummyObj = NULL;
>             dummyvtype
>             volatile * dummy = &dummyObj->fieldName; }
>
>
>         Actually, I believe these two are equivalent:
>
>               volatile dummyvtype* dummy =
>               dummyvtype volatile * dummy =
>
>         based on my reading of the URL that I put in the original webrev...
>
>         So it's not a bug, it's one variation of an acceptable style.
>
>
>     Not when dummyvtype is itself a pointer type. Consider:
>
>     volatile int* *dummy = ...;
>
>     Here dummy is a pointer to a pointer to a volatile int.
>
>     But in:
>
>     int* volatile *dummy = ...;
>
>     dummy is a pointer to a volatile pointer to an int
>
>     Cheers,
>     David
>     -----
>
>
>
>
>
>             and the static version would follow the same form. dummy is
>             a pointer
>             to a volatile field of type dummyvtype. (I'm unclear why the
>             dummyObj
>             variable is introduced though ??).
>
>
>         'dummyObj' is used to access the field: &dummyObj->fieldName
>
>
>             I wonder if Kim wants to wade in on this one :)
>
>
>         Dunno.
>
>         Dan
>
>
>
>             Cheers,
>             David
>             -----
>
>
>                 In the existing volatile non-static macro, the volatile
>                 piece is:
>
>                       volatile dummyvtype* dummy = &dummyObj->fieldName;
>
>                 and in the new static pointer volatile macro, the
>                 volatile piece is:
>
>                       type volatile * dummy = &typeName::fieldName;
>
>                 So the CHECK_VOLATILE_NONSTATIC_XXX macro has the
>                 "volatile" before
>                 the data type... and the CHECK_STATIC_PTR_VOLATILE_XXX macro
>                 has the "volatile" after the data type...
>
>                 Dan
>
>
>
>                     Cheers,
>                     David
>
>                         Dan
>
>
>                             Thanks,
>                             David
>
>                                 Testing: Aurora Adhoc RT-SVC nightly batch
>                                            4 inner-complex fastdebug
>                                 parallel runs for 4+ days and
>                                              600K iterations without
>                                 seeing this failure; the
>                                 experiment
>                                              is still running; final
>                                 results to be reported at the
>                                 end
>                                              of the review cycle
>                                            JPRT -testset hotspot
>
>                                 This fix:
>
>                                 - makes ObjectMonitor::gBlockList volatile
>                                 - uses
>                                 "OrderAccess::release_store_ptr(&gBlockList,
>                                 temp)" to
>                                     make sure the new block updates
>                                 _happen before_ gBlockList is
>                                     changed to refer to the new block
>                                 - add SA support for a "static pointer
>                                 volatile" field like:
>
>                                       static ObjectMonitor * volatile
>                                 gBlockList;
>
>                                 See the following link for a nice
>                                 description of what "volatile"
>                                 means in the different positions on a
>                                 variable/parameter decl line:
>
>                                 http://www.embedded.com/electronics-blogs/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword
>
>
>
>
>
>                                 Thanks, in advance, for any comments,
>                                 questions or suggestions.
>
>                                 Dan
>
>


More information about the hotspot-runtime-dev mailing list