forked from OSchip/llvm-project
Add an atomic increment and decrement implementation, which will be used for
thread-safe reference counting. llvm-svn: 73587
This commit is contained in:
parent
c39919151d
commit
8d0fe6f0d7
|
@ -935,6 +935,8 @@ AC_LINK_IFELSE(
|
|||
volatile unsigned long val = 1;
|
||||
__sync_synchronize();
|
||||
__sync_val_compare_and_swap(&val, 1, 0);
|
||||
__sync_add_and_fetch(&val, 1);
|
||||
__sync_sub_and_fetch(&val, 1);
|
||||
return 0;
|
||||
}
|
||||
]]),
|
||||
|
|
|
@ -33760,6 +33760,8 @@ int main() {
|
|||
volatile unsigned long val = 1;
|
||||
__sync_synchronize();
|
||||
__sync_val_compare_and_swap(&val, 1, 0);
|
||||
__sync_add_and_fetch(&val, 1);
|
||||
__sync_sub_and_fetch(&val, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,8 @@ namespace llvm {
|
|||
cas_flag CompareAndSwap(volatile cas_flag* ptr,
|
||||
cas_flag new_value,
|
||||
cas_flag old_value);
|
||||
cas_flag AtomicPostIncrement(volatile cas_flag* ptr);
|
||||
cas_flag AtomicPostDecrement(volatile cas_flag* ptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -353,10 +353,7 @@ public:
|
|||
/// addAbstractTypeUser - Notify an abstract type that there is a new user of
|
||||
/// it. This function is called primarily by the PATypeHandle class.
|
||||
///
|
||||
void addAbstractTypeUser(AbstractTypeUser *U) const {
|
||||
assert(isAbstract() && "addAbstractTypeUser: Current type not abstract!");
|
||||
AbstractTypeUsers.push_back(U);
|
||||
}
|
||||
void addAbstractTypeUser(AbstractTypeUser *U) const;
|
||||
|
||||
/// removeAbstractTypeUser - Notify an abstract type that a user of the class
|
||||
/// no longer has a handle to the type. This function is called primarily by
|
||||
|
|
|
@ -51,3 +51,31 @@ sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
|
|||
# error No compare-and-swap implementation for your platform!
|
||||
#endif
|
||||
}
|
||||
|
||||
sys::cas_flag sys::AtomicPostIncrement(volatile sys::cas_flag* ptr) {
|
||||
#if LLVM_MULTITHREADED==0
|
||||
++(*ptr);
|
||||
return *ptr;
|
||||
#elif defined(__GNUC__)
|
||||
return __sync_add_and_fetch(ptr, 1);
|
||||
#elif defined(_MSC_VER)
|
||||
return InterlockedCompareExchange(ptr, new_value, old_value);
|
||||
#else
|
||||
# error No atomic increment implementation for your platform!
|
||||
#endif
|
||||
}
|
||||
|
||||
sys::cas_flag sys::AtomicPostDecrement(volatile sys::cas_flag* ptr) {
|
||||
#if LLVM_MULTITHREADED==0
|
||||
--(*ptr);
|
||||
return *ptr;
|
||||
#elif defined(__GNUC__)
|
||||
return __sync_sub_and_fetch(ptr, 1);
|
||||
#elif defined(_MSC_VER)
|
||||
return InterlockedIncrement(ptr);
|
||||
#else
|
||||
# error No atomic decrement implementation for your platform!
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue