RFR: 8185723: Zero: segfaults on Power PC 32-bit
Andrew Haley
aph at redhat.com
Thu Aug 3 11:58:22 UTC 2017
On 03/08/17 11:43, John Paul Adrian Glaubitz wrote:
> On 08/03/2017 12:06 PM, Andrew Haley wrote:
>> But there may be a better way of handling atomic doublewords on the
>> 68k. Instead, define an array of lock words and yield on one of them
>> when reading or writing a doubleword. That way you (probably) only
>> block when two threads really are contending, and the instant you
>> detect contention you yield.
Use lock_address(a) for all atomic double operations. Then you don't
need any assembly language for 64-bit atomic ops. It's simple, but
it's not super-efficient. It has the virtue that it will work on
every platform.
My guess is that it's good enough for Zero.
template <typename T>
static inline int hash(T *a) {
unsigned int n = (unsigned int)(uintptr_t)a;
return (n + (n >> 8)) & 255; // Or simply n % 255 if that's faster
}
template <typename T>
static inline void lock_address(T *a) {
int n = hash(a);
while (__sync_lock_test_and_set(&locks[n], 1)) {
pthread_yield();
}
}
template <typename T>
static inline void unlock_address(T *a) {
int n = hash(a);
__sync_lock_release(&locks[n]);
}
void atomic_copy64(const volatile void *src, volatile void *dst) {
lock_address(src);
uint64_t tmp = *(uint64_t*)src;
unlock_address(src);
lock_address(dst);
*(uint64_t*)dst = tmp;
unlock_address(dst);
}
--
Andrew Haley
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
More information about the hotspot-dev
mailing list