/*
 * rpc_atomic.c
 *
 *  Created on: 2011-4-11
 *      Author: yanghu
 */


#include "rpc_atomic.h"

int rpc_atomic_int_get(volatile int *atomic){
  __sync_synchronize();
  return *atomic;
}

void rpc_atomic_int_set(volatile int *atomic,int newval){
  *atomic = newval;
  __sync_synchronize();
}

void rpc_atomic_int_add(volatile int *atomic,int val){
  __sync_fetch_and_add(atomic,val);  
}

int rpc_atomic_int_exchange_and_add(volatile int *atomic,int val){
  return __sync_fetch_and_add(atomic,val);  
}

boolean rpc_atomic_int_compare_and_exchange(volatile int *atomic,int oldval,int newval){
  return __sync_bool_compare_and_swap(atomic,oldval,newval);
}

pointer rpc_atomic_pointer_get(volatile pointer *atomic){
  __sync_synchronize();
  return *atomic;
}

void rpc_atomic_pointer_set(volatile pointer *atomic,pointer newval){
  *atomic = newval;
  __sync_synchronize();
}

boolean rpc_atomic_pointer_compare_and_exchange(volatile pointer *atomic,pointer oldval,pointer newval){
  return __sync_bool_compare_and_swap(atomic,oldval,newval);
}