Artifact aef7e3462c51f9299c7edea5bc8bf354bf4b4881f96cce0badafdd9733393d2d:
- File
src/runtime/autorelease.m
— part of check-in
[f5927f8a84]
at
2012-07-14 20:00:11
on branch trunk
— New autorelease pools.
This uses the runtime's autorelease pools and implements autorelease
pools in the ObjFW runtime. It therefore uses ObjFW's autorelease pools
when using the ObjFW runtime and Apple's autorelease pools when using
the Apple runtime.These new pools should be ARC-compatible now and finally, it should be
possible to mix OFAutoreleasePools and NSAutoreleasePools again, even
@autoreleasepool is allowed in the mix now. This also means the old
bridge to NSAutoreleasePool should not be required anymore, as both use
the runtime's autorelease pools now.As a bonus, it's significantly faster to use the ObjFW runtime with
ObjFW's autorelease pools than to use Apple's runtime with Apple's
autorelease pools, as a quick benchmark using OFXMLParser on large files
showed. (Note: This is not only due to the different autorelease pools,
but also due to the fact that even with the same autorelease pools it is
faster using the ObjFW runtime, as can be seen in versions prior to this
commit.) (user: js, size: 1595) [annotate] [blame] [check-ins using]
/* * Copyright (c) 2008, 2009, 2010, 2011, 2012 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <stdio.h> #include <stdlib.h> #import "runtime.h" #import "runtime-private.h" #import "OFObject.h" #import "macros.h" static __thread id *objects = NULL; static __thread id *top = NULL; static size_t size = 0; id objc_autorelease(id object) { return [object autorelease]; } void* objc_autoreleasePoolPush() { ptrdiff_t offset = top - objects; return (void*)offset; } void objc_autoreleasePoolPop(void *offset) { id *pool = objects + (ptrdiff_t)offset; id *iter; for (iter = pool; iter < top; iter++) [*iter release]; top = pool; } id _objc_rootAutorelease(id object) { if (objects == NULL) { if ((objects = malloc(of_pagesize)) == NULL) ERROR("Out of memory for autorelease pools!") top = objects; } if ((uintptr_t)top >= (uintptr_t)objects + size) { ptrdiff_t diff = top - objects; size += of_pagesize; if ((objects = realloc(objects, size)) == NULL) ERROR("Out of memory for autorelease pools!") top = objects + diff; } *top = object; top++; return object; }