< prev index next >
src/hotspot/share/runtime/stubCodeGenerator.hpp
Print this page
rev 51308 : 8206267: Unsafe publication of StubCodeDesc leads to crashes
Reviewed-by: kvn
*** 25,34 ****
--- 25,35 ----
#ifndef SHARE_VM_RUNTIME_STUBCODEGENERATOR_HPP
#define SHARE_VM_RUNTIME_STUBCODEGENERATOR_HPP
#include "asm/assembler.hpp"
#include "memory/allocation.hpp"
+ #include "runtime/orderAccess.hpp"
// All the basic framework for stub code generation/debugging/printing.
// A StubCodeDesc describes a piece of generated code (usually stubs).
*** 36,46 ****
// Currently, code descriptors are simply chained in a linked list,
// this may have to change if searching becomes too slow.
class StubCodeDesc: public CHeapObj<mtCode> {
private:
! static StubCodeDesc* _list; // the list of all descriptors
static bool _frozen; // determines whether _list modifications are allowed
StubCodeDesc* _next; // the next element in the linked list
const char* _group; // the group to which the stub code belongs
const char* _name; // the name assigned to the stub code
--- 37,47 ----
// Currently, code descriptors are simply chained in a linked list,
// this may have to change if searching becomes too slow.
class StubCodeDesc: public CHeapObj<mtCode> {
private:
! static StubCodeDesc *volatile _list; // the list of all descriptors
static bool _frozen; // determines whether _list modifications are allowed
StubCodeDesc* _next; // the next element in the linked list
const char* _group; // the group to which the stub code belongs
const char* _name; // the name assigned to the stub code
*** 74,84 ****
_next = _list;
_group = group;
_name = name;
_begin = begin;
_end = end;
! _list = this;
};
static void freeze();
const char* group() const { return _group; }
--- 75,85 ----
_next = _list;
_group = group;
_name = name;
_begin = begin;
_end = end;
! OrderAccess::release_store(&_list, this);
};
static void freeze();
const char* group() const { return _group; }
< prev index next >