JVM Atomic Atomic::cmpxchg

jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {

  assert(sizeof(jbyte) == 1, "assumption.");

  uintptr_t dest_addr = (uintptr_t)dest;

  uintptr_t offset = dest_addr % sizeof(jint);

  volatile jint* dest_int = (volatile jint*)(dest_addr - offset);

  jint cur = *dest_int;

  jbyte* cur_as_bytes = (jbyte*)(&cur);

  jint new_val = cur;

  jbyte* new_val_as_bytes = (jbyte*)(&new_val);

  new_val_as_bytes[offset] = exchange_value;

  while (cur_as_bytes[offset] == compare_value) {

    jint res = cmpxchg(new_val, dest_int, cur);

    if (res == cur) break;

    cur = res;

    new_val = cur;

    new_val_as_bytes[offset] = exchange_value;

  }

  return cur_as_bytes[offset];

}

猜你喜欢

转载自lobin.iteye.com/blog/2311755