Added helper function for C++ non-POD type atomic properties.

Fixed prototypes of specialised property functions.
main
theraven 13 years ago
parent a9be008911
commit d0562d2127

@ -8,6 +8,9 @@ programs. Highlights of this release include:
- A new CMake-based build system
- Added specialised property accessor functions and support for atomic
properties with C++ non-POD types.
- A new exception implementation providing better integration with foreign
exceptions (e.g. C++ exceptions) (TODO)

@ -84,7 +84,7 @@ void objc_setProperty(id obj, SEL _cmd, ptrdiff_t offset, id arg, BOOL isAtomic,
objc_release(old);
}
void objc_setProperty_atomic(id obj, SEL _cmd, ptrdiff_t offset, id arg)
void objc_setProperty_atomic(id obj, SEL _cmd, id arg, ptrdiff_t offset)
{
char *addr = (char*)obj;
addr += offset;
@ -97,7 +97,7 @@ void objc_setProperty_atomic(id obj, SEL _cmd, ptrdiff_t offset, id arg)
objc_release(old);
}
void objc_setProperty_atomic_copy(id obj, SEL _cmd, ptrdiff_t offset, id arg)
void objc_setProperty_atomic_copy(id obj, SEL _cmd, id arg, ptrdiff_t offset)
{
char *addr = (char*)obj;
addr += offset;
@ -111,7 +111,7 @@ void objc_setProperty_atomic_copy(id obj, SEL _cmd, ptrdiff_t offset, id arg)
objc_release(old);
}
void objc_setProperty_nonatomic(id obj, SEL _cmd, ptrdiff_t offset, id arg)
void objc_setProperty_nonatomic(id obj, SEL _cmd, id arg, ptrdiff_t offset)
{
char *addr = (char*)obj;
addr += offset;
@ -121,7 +121,7 @@ void objc_setProperty_nonatomic(id obj, SEL _cmd, ptrdiff_t offset, id arg)
objc_release(old);
}
void objc_setProperty_nonatomic_copy(id obj, SEL _cmd, ptrdiff_t offset, id arg)
void objc_setProperty_nonatomic_copy(id obj, SEL _cmd, id arg, ptrdiff_t offset)
{
char *addr = (char*)obj;
addr += offset;
@ -130,6 +130,36 @@ void objc_setProperty_nonatomic_copy(id obj, SEL _cmd, ptrdiff_t offset, id arg)
objc_release(old);
}
void objc_copyCppObjectAtomic(void *dest, const void *src,
void (*copyHelper) (void *dest, const void *source))
{
volatile int *lock = lock_for_pointer(src < dest ? src : dest);
volatile int *lock2 = lock_for_pointer(src < dest ? dest : src);
lock_spinlock(lock);
lock_spinlock(lock2);
copyHelper(dest, src);
unlock_spinlock(lock);
unlock_spinlock(lock2);
}
void objc_getCppObjectAtomic(void *dest, const void *src,
void (*copyHelper) (void *dest, const void *source))
{
volatile int *lock = lock_for_pointer(src);
lock_spinlock(lock);
copyHelper(dest, src);
unlock_spinlock(lock);
}
void objc_setCppObjectAtomic(void *dest, const void *src,
void (*copyHelper) (void *dest, const void *source))
{
volatile int *lock = lock_for_pointer(dest);
lock_spinlock(lock);
copyHelper(dest, src);
unlock_spinlock(lock);
}
/**
* Structure copy function. This is provided for compatibility with the Apple
* APIs (it's an ABI function, so it's semi-public), but it's a bad design so
@ -145,8 +175,8 @@ void objc_copyPropertyStruct(void *dest,
{
if (atomic)
{
volatile int *lock = lock_for_pointer(src);
volatile int *lock2 = lock_for_pointer(src);
volatile int *lock = lock_for_pointer(src < dest ? src : dest);
volatile int *lock2 = lock_for_pointer(src < dest ? dest : src);
lock_spinlock(lock);
lock_spinlock(lock2);
memcpy(dest, src, size);

@ -26,7 +26,7 @@ extern int spinlocks[spinlock_count];
* contention between the same property in different objects, so we can't just
* use the ivar offset.
*/
static inline volatile int *lock_for_pointer(void *ptr)
static inline volatile int *lock_for_pointer(const void *ptr)
{
intptr_t hash = (intptr_t)ptr;
// Most properties will be pointers, so disregard the lowest few bits

Loading…
Cancel
Save