Mercurial > hg > graal-jvmci-8
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 |