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];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值