comparison src/share/vm/runtime/atomic.hpp @ 11033:d9eed26d638a

8009575: Reduce Symbol::_refcount from 4 bytes to 2 bytes Summary: Added Atomic::inc(short*) to support this change. Reviewed-by: coleenp, dcubed, dholmes, minqi
author iklam
date Sun, 23 Jun 2013 22:08:28 -0700
parents 0598674c0056
children de6a9e811145
comparison
equal deleted inserted replaced
11032:b7bc7c94b4b5 11033:d9eed26d638a
62 // See comment above about using jlong atomics on 32-bit platforms 62 // See comment above about using jlong atomics on 32-bit platforms
63 static jlong add (jlong add_value, volatile jlong* dest); 63 static jlong add (jlong add_value, volatile jlong* dest);
64 64
65 // Atomically increment location 65 // Atomically increment location
66 inline static void inc (volatile jint* dest); 66 inline static void inc (volatile jint* dest);
67 static void inc (volatile jshort* dest);
67 inline static void inc_ptr(volatile intptr_t* dest); 68 inline static void inc_ptr(volatile intptr_t* dest);
68 inline static void inc_ptr(volatile void* dest); 69 inline static void inc_ptr(volatile void* dest);
69 70
70 // Atomically decrement a location 71 // Atomically decrement a location
71 inline static void dec (volatile jint* dest); 72 inline static void dec (volatile jint* dest);
73 static void dec (volatile jshort* dest);
72 inline static void dec_ptr(volatile intptr_t* dest); 74 inline static void dec_ptr(volatile intptr_t* dest);
73 inline static void dec_ptr(volatile void* dest); 75 inline static void dec_ptr(volatile void* dest);
74 76
75 // Performs atomic exchange of *dest with exchange_value. Returns old prior value of *dest. 77 // Performs atomic exchange of *dest with exchange_value. Returns old prior value of *dest.
76 inline static jint xchg(jint exchange_value, volatile jint* dest); 78 inline static jint xchg(jint exchange_value, volatile jint* dest);
93 95
94 inline static intptr_t cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value); 96 inline static intptr_t cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value);
95 inline static void* cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value); 97 inline static void* cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value);
96 }; 98 };
97 99
100 // To use Atomic::inc(jshort* dest) and Atomic::dec(jshort* dest), the address must be specially
101 // aligned, such that (*dest) occupies the upper 16 bits of an aligned 32-bit word. The best way to
102 // achieve is to place your short value next to another short value, which doesn't need atomic ops.
103 //
104 // Example
105 // ATOMIC_SHORT_PAIR(
106 // volatile short _refcount, // needs atomic operation
107 // unsigned short _length // number of UTF8 characters in the symbol (does not need atomic op)
108 // );
109
110 #ifdef VM_LITTLE_ENDIAN
111 #define ATOMIC_SHORT_PAIR(atomic_decl, non_atomic_decl) \
112 non_atomic_decl; \
113 atomic_decl
114 #else
115 #define ATOMIC_SHORT_PAIR(atomic_decl, non_atomic_decl) \
116 atomic_decl ; \
117 non_atomic_decl
118 #endif
119
98 #endif // SHARE_VM_RUNTIME_ATOMIC_HPP 120 #endif // SHARE_VM_RUNTIME_ATOMIC_HPP