︙ | | | ︙ | |
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
|
block->descriptor->copy_helper(copy, block);
return copy;
}
if ([(id)block isMemberOfClass: (Class)&_NSConcreteMallocBlock]) {
#ifdef OF_HAVE_ATOMIC_OPS
of_atomic_int_inc(&block->flags);
#else
unsigned hash = SPINLOCK_HASH(block);
OF_ENSURE(OFSpinlockLock(&blockSpinlocks[hash]) == 0);
block->flags++;
OF_ENSURE(OFSpinlockUnlock(&blockSpinlocks[hash]) == 0);
#endif
|
|
|
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
|
block->descriptor->copy_helper(copy, block);
return copy;
}
if ([(id)block isMemberOfClass: (Class)&_NSConcreteMallocBlock]) {
#ifdef OF_HAVE_ATOMIC_OPS
OFAtomicIntIncrease(&block->flags);
#else
unsigned hash = SPINLOCK_HASH(block);
OF_ENSURE(OFSpinlockLock(&blockSpinlocks[hash]) == 0);
block->flags++;
OF_ENSURE(OFSpinlockUnlock(&blockSpinlocks[hash]) == 0);
#endif
|
︙ | | | ︙ | |
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
{
struct block *block = (struct block *)block_;
if (object_getClass((id)block) != (Class)&_NSConcreteMallocBlock)
return;
#ifdef OF_HAVE_ATOMIC_OPS
if ((of_atomic_int_dec(&block->flags) & OF_BLOCK_REFCOUNT_MASK) == 0) {
if (block->flags & OF_BLOCK_HAS_COPY_DISPOSE)
block->descriptor->dispose_helper(block);
free(block);
}
#else
unsigned hash = SPINLOCK_HASH(block);
|
>
|
|
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
{
struct block *block = (struct block *)block_;
if (object_getClass((id)block) != (Class)&_NSConcreteMallocBlock)
return;
#ifdef OF_HAVE_ATOMIC_OPS
if ((OFAtomicIntDecrease(&block->flags) &
OF_BLOCK_REFCOUNT_MASK) == 0) {
if (block->flags & OF_BLOCK_HAS_COPY_DISPOSE)
block->descriptor->dispose_helper(block);
free(block);
}
#else
unsigned hash = SPINLOCK_HASH(block);
|
︙ | | | ︙ | |
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
((*dst)->flags & ~OF_BLOCK_REFCOUNT_MASK) | 1;
(*dst)->forwarding = *dst;
if (src->flags & OF_BLOCK_HAS_COPY_DISPOSE)
src->byref_keep(*dst, src);
#ifdef OF_HAVE_ATOMIC_OPS
if (!of_atomic_ptr_cmpswap((void **)&src->forwarding,
src, *dst)) {
src->byref_dispose(*dst);
free(*dst);
*dst = src->forwarding;
}
#else
unsigned hash = SPINLOCK_HASH(src);
|
|
|
|
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
((*dst)->flags & ~OF_BLOCK_REFCOUNT_MASK) | 1;
(*dst)->forwarding = *dst;
if (src->flags & OF_BLOCK_HAS_COPY_DISPOSE)
src->byref_keep(*dst, src);
#ifdef OF_HAVE_ATOMIC_OPS
if (!OFAtomicPointerCompareAndSwap(
(void **)&src->forwarding, src, *dst)) {
src->byref_dispose(*dst);
free(*dst);
*dst = src->forwarding;
}
#else
unsigned hash = SPINLOCK_HASH(src);
|
︙ | | | ︙ | |
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
|
OF_ENSURE(
OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0);
#endif
} else
*dst = src;
#ifdef OF_HAVE_ATOMIC_OPS
of_atomic_int_inc(&(*dst)->flags);
#else
unsigned hash = SPINLOCK_HASH(*dst);
OF_ENSURE(OFSpinlockLock(&byrefSpinlocks[hash]) == 0);
(*dst)->flags++;
OF_ENSURE(OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0);
#endif
|
|
|
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
|
OF_ENSURE(
OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0);
#endif
} else
*dst = src;
#ifdef OF_HAVE_ATOMIC_OPS
OFAtomicIntIncrease(&(*dst)->flags);
#else
unsigned hash = SPINLOCK_HASH(*dst);
OF_ENSURE(OFSpinlockLock(&byrefSpinlocks[hash]) == 0);
(*dst)->flags++;
OF_ENSURE(OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0);
#endif
|
︙ | | | ︙ | |
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
break;
case OF_BLOCK_FIELD_IS_BYREF:;
struct byref *object = (struct byref *)object_;
object = object->forwarding;
#ifdef OF_HAVE_ATOMIC_OPS
if ((of_atomic_int_dec(&object->flags) &
OF_BLOCK_REFCOUNT_MASK) == 0) {
if (object->flags & OF_BLOCK_HAS_COPY_DISPOSE)
object->byref_dispose(object);
free(object);
}
#else
|
|
|
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
|
break;
case OF_BLOCK_FIELD_IS_BYREF:;
struct byref *object = (struct byref *)object_;
object = object->forwarding;
#ifdef OF_HAVE_ATOMIC_OPS
if ((OFAtomicIntDecrease(&object->flags) &
OF_BLOCK_REFCOUNT_MASK) == 0) {
if (object->flags & OF_BLOCK_HAS_COPY_DISPOSE)
object->byref_dispose(object);
free(object);
}
#else
|
︙ | | | ︙ | |